使用Java进行日期比较
我有两个约会:使用Java进行日期比较,java,date,Java,Date,我有两个约会: toDate(用户以MM/dd/yyyy格式输入) currentDate(通过new Date()获取) 我需要将currentDate与toDate进行比较。只有当toDate等于或大于currentDate时,我才必须显示报告。我该怎么做呢?和 如果hour和minute字段可能不正确!=0,则必须将其设置为0 我不能忘记提到,使用java.util.Date被认为是一种不好的做法,它的大多数方法都被弃用。使用java.util.Calendar或者,如果可能的话。如果您有
toDate
(用户以MM/dd/yyyy
格式输入)currentDate
(通过new Date()
获取)currentDate
与toDate
进行比较。只有当toDate
等于或大于currentDate
时,我才必须显示报告。我该怎么做呢?和
如果hour
和minute
字段可能不正确!=0,则必须将其设置为0
我不能忘记提到,使用
java.util.Date
被认为是一种不好的做法,它的大多数方法都被弃用。使用java.util.Calendar
或者,如果可能的话。如果您有大量与日期相关的处理,请使用java.util.Calendar
日期有
before()
,after()
方法。您也可以使用它们。您可能正在寻找:
!toDate.before(currentDate)
before()和after()测试日期是严格在之前还是之后。因此,您必须对另一个进行否定,才能获得非严格行为。使用
java.util.Calendar
比较日期更容易。
以下是您可能会做的:
Calendar toDate = Calendar.getInstance();
Calendar nowDate = Calendar.getInstance();
toDate.set(<set-year>,<set-month>,<set-day>);
if(!toDate.before(nowDate)) {
//display your report
} else {
// don't display the report
}
日历toDate=Calendar.getInstance();
Calendar nowDate=Calendar.getInstance();
toDate.set(,);
如果(!toDate.早于(nowDate)){
//显示您的报告
}否则{
//不显示报告
}
如果设置使用Java日期而不是JodaTime,请使用a将字符串转换为日期,然后使用.equals: 我差点忘了:在比较它们之前,您需要将当前日期的小时、分钟、秒和毫秒归零。我用下面的一个物体来做这件事
import java.text.DateFormat;
import java.util.Calendar;
import java.util.Date;
// Other code here
String toDate;
//toDate = "05/11/2010";
// Value assigned to toDate somewhere in here
DateFormat df = DateFormat.getDateInstance(DateFormat.SHORT);
Calendar currDtCal = Calendar.getInstance();
// Zero out the hour, minute, second, and millisecond
currDtCal.set(Calendar.HOUR_OF_DAY, 0);
currDtCal.set(Calendar.MINUTE, 0);
currDtCal.set(Calendar.SECOND, 0);
currDtCal.set(Calendar.MILLISECOND, 0);
Date currDt = currDtCal.getTime();
Date toDt;
try {
toDt = df.parse(toDate);
} catch (ParseException e) {
toDt = null;
// Print some error message back to the user
}
if (currDt.equals(toDt)) {
// They're the same date
}
这是一种方式:
String toDate = "05/11/2010";
if (new SimpleDateFormat("MM/dd/yyyy").parse(toDate).getTime() / (1000 * 60 * 60 * 24) >= System.currentTimeMillis() / (1000 * 60 * 60 * 24)) {
System.out.println("Display report.");
} else {
System.out.println("Don't display report.");
}
更容易理解的是:
String toDateAsString = "05/11/2010";
Date toDate = new SimpleDateFormat("MM/dd/yyyy").parse(toDateAsString);
long toDateAsTimestamp = toDate.getTime();
long currentTimestamp = System.currentTimeMillis();
long getRidOfTime = 1000 * 60 * 60 * 24;
long toDateAsTimestampWithoutTime = toDateAsTimestamp / getRidOfTime;
long currentTimestampWithoutTime = currentTimestamp / getRidOfTime;
if (toDateAsTimestampWithoutTime >= currentTimestampWithoutTime) {
System.out.println("Display report.");
} else {
System.out.println("Don't display report.");
}
哦,作为奖励,这是一个变种:
String toDateAsString = "05/11/2010";
DateTime toDate = DateTimeFormat.forPattern("MM/dd/yyyy").parseDateTime(toDateAsString);
DateTime now = new DateTime();
if (!toDate.toLocalDate().isBefore(now.toLocalDate())) {
System.out.println("Display report.");
} else {
System.out.println("Don't display report.");
}
如果出于某种原因,您打算在解决方案中使用
Date
对象,则需要执行以下操作:
// Convert user input into year, month, and day integers
Date toDate = new Date(year - 1900, month - 1, day + 1);
Date currentDate = new Date();
boolean runThatReport = toDate.after(currentDate);
将toDate
提前到第二天午夜将解决我在对其他答案的评论中抱怨的bug。但是,请注意,这种方法使用了不推荐使用的构造函数;任何依赖于Date
的方法都会使用一种或另一种不推荐的方法,这取决于您的操作方式,也可能导致比赛条件(例如,如果您将toDate
设置为new Date()
,然后摆弄年份、月份和日期)。如其他地方所述,使用日历。Datelong getTime()
返回此日期对象表示的自1970年1月1日00:00:00 GMT以来的毫秒数
//test if date1 is before date2
if(date1.getTime() < date2.getTime()) {
....
}
//测试date1是否早于date2
if(date1.getTime()
专用布尔值checkDateLimit(){
long currentDateInMilicond=System.currentTimeMillis();//日期1
long date1inmilisence=Date1.getTimeInMillis();//Date2
如果(CurrentDateInMilicond)给定该日期等于()将比较毫秒,他将当前日期与MM/dd/yyyy用户输入进行比较,这不是一种有效的方法。他希望进行比较,而不是检查是否相等。是的,谢谢,我在
方法之后添加了。如果他将用户输入的MM/dd/yyyy数据转换为日期对象,该对象上的有效时间不是那天早上0:00吗ing?如果我错了,请纠正我,但在我看来,如果用户输入今天的日期,这种方法将失败。是的,但是equals()是以毫秒为基础的;不是before()和after()基于它吗?如果toDate基于MM/dd/yyyy输入,他还需要手动将时间设置为第二天午夜前一毫秒;否则,如果用户输入今天的日期,这种方法将失败。(不是吗?)问题:您是否需要明确清除超出nowDate的小时/分钟/等字段,或者它们没有设置为toDate表示它们不重要?+1用于使用日历。如果您没有在毫秒级附近进行比较,通常需要清除()创建日历后,请立即调用set方法。@Ophidian感谢clear()的建议我想知道为什么不接受Yet您最初的问题说的很糟糕。我已经改进了它。以后请尽量清晰。不要重复三次和/或不必要的加粗:)如果你考虑使用JDA数据库JoDATME提供比java的日期API更多的帮助,它会使这个和你的其他日期任务变得容易很多。如果我错了请纠正我,但是如果用户输入今天的日期“新数据”,这不会失败吗?将时间设置为无论何时调用,并且基于MM/dd/yyyy的日期对象将有效地设置为当天早上0:00。或者是Date.before()和Date.after(),而不是基于毫秒的方式Date.equals()是吗?没错。实际上,您必须在java.util.Date中使用日历或日期格式化程序来消除时间。修复了其中的一些错误…忘记捕获原始版本中的ParseException
。第一个示例非常适合我的需要:)
private boolean checkDateLimit() {
long CurrentDateInMilisecond = System.currentTimeMillis(); // Date 1
long Date1InMilisecond = Date1.getTimeInMillis(); //Date2
if (CurrentDateInMilisecond <= Date1InMilisecond) {
return true;
} else {
return false;
}
}