检查一个日期是否恰好是24小时或更长时间

我在Java中使用compareTo方法尝试检查某个日期是否大于或等于另一个日期之后的24小时。

如何确定要比较日期的整数?

答案取决于你想要达到的目标。

一种方法,可以是以毫秒为单位检查差异。 可以通过计算24小时(毫秒)

 24 * 60 * 60 * 1000 = 86400000 h min sec millis 

(在代码中你也可以编写TimeUnit.HOURS.toMillis(24) ,其中IMO更具描述性)

所以现在你可以检查两个日期之间的差异(以毫秒表示)是否大于86400000。

使用Calendar类。 如果您已有Date对象,仍可以使用Calendar

 Date aDate = . . . Calendar today = Calendar.getInstance(); today.setTime(aDate); Calendar tomorrow = Calendar.getInstance(); tomorrow.setTime(aDate); tomorrow.add(Calendar.DAY, 1); Date tomorrowDate = tomorrow.getTime(); // if you need a Date object 

TL;博士

 myUtilDate_B .toInstant() .equals( myUtilDate_A.toInstant().plus( 24 , ChronoUnit.HOURS ) ) // Exactly 24 hours apart. 

…和…

 myUtilDate_B .toInstant() .isAfter( myUtilDate_A.toInstant().plus( 24 , ChronoUnit.HOURS ) ) // Over 24 hours apart. 

另外…

 Duration.between( myUtilDate_A , myUtilDate_B ) .compareTo( Duration.ofHours( 24 ) ) // Returns 0 if exactly 24 hours apart, // >0 if over 24 hours apart. 

java.time

您特别要求比较两个日期时间,询问是否:

  • 比其他人晚24小时
  • 比另一个晚24个小时。

您提到的compareTo方法不会这样做。 它旨在仅仅判断一个时刻是相同,更晚或更早。 该方法不关心特定的时间跨度,例如24小时。

您明确指出日期无关紧要。 因此,您希望忽略夏令时(DST)等exception情况,这些exception会使一天长于或短于24小时。

所以我们可以在UTC工作。 不需要时区。

如果您指的是java.util.Date对象,请先将它们转换为java.time对象。 Date类是麻烦的旧日期时间类的一部分,以及Calendar ,现在是遗留的,由java.time类取代。

java.util.Date的等价物是java.time.InstantInstant类表示UTC时间轴上的一个时刻,分辨率为纳秒 (最多九(9)位小数)。

您可以通过添加到旧类的新方法转换为java.time类型。

 Instant start = myUtilDate_Start.toInstant(); Instant stop = myUtilDate_Stop.toInstant(); 

定义我们关心的差距,在本例中为24小时,作为Duration对象。

 Duration d = Duration.ofHours( 24 ); // We mean literally 24 hours, not a day. 

使用该Duration来计算24小时后的值。 通过ChronoUnit枚举定义小时数。

 Instant target = start.plus( 24 , ChronoUnit.HOURS ); 

最后,比较第二个日期时间值。 呼叫equals和是isAfter

 Boolean isExactly24HoursLater = stop.equals( target ); Boolean isOver24HoursLater = stop.isAfter( target ); 

关于java.time

java.time框架内置于Java 8及更高版本中。 这些类取代了麻烦的旧遗留日期时间类,如java.util.DateCalendarSimpleDateFormat

现在处于维护模式的Joda-Time项目建议迁移到java.time。

要了解更多信息,请参阅Oracle教程 。 并搜索Stack Overflow以获取许多示例和解释。 规范是JSR 310 。

从哪里获取java.time类?

  • Java SE 8SE 9及更高版本
    • 内置。
    • 带有捆绑实现的标准Java API的一部分。
    • Java 9增加了一些小function和修复。
  • Java SE 6SE 7
    • 许多java.timefunction都被反向移植到ThreeTen-Backport中的 Java 6和7。
  • Android的
    • ThreeTenABP项目特别适用于Android的ThreeTen-Backport (如上所述)。
    • 请参阅如何使用….

ThreeTen-Extra项目使用其他类扩展了java.time。 该项目是未来可能添加到java.time的试验场。 您可以在这里找到一些有用的课程,如IntervalYearWeekYearQuarter等。


乔达时间

更新:现在处于维护模式的Joda-Time项目建议迁移到java.time类。 此部分在此处保留完整的历史记录。

Joda-Time使这项工作更容易。

 DateTimeZone timeZone = DateTimeZone.forID( "Europe/Paris" ); DateTime dateTimeInQuestion = new DateTime( 2014, 1, 2, 3, 4, 5, 6, timeZone ); // Or: new DateTime( someJavaDotUtilDotDateObject ); DateTime now = new DateTime( timeZone ); DateTime twentyFourHoursFromNow = now.plusHours( 24 ); // Ignores Daylight Saving Time (DST). If you want to adjust for that, call: plusDays( 1 ) instead. DateTime isDateTimeInQuestionAfter24HoursFromNow = dateTime.isAfter( twentyFourHoursFromNow ); 

1天≠24小时

如果您真的打算考虑第二天的挂钟时间 ,请拨打plusDays( 1 )而不是plusHours( 24 ) 。 Joda-Time然后调整夏令时(DST)或其他exception。 例如,在美国,由于我们1小时的DST愚蠢,这可能意味着25小时而不是24小时。

24小时内比较

如果真的要测试所讨论的日期时间是否 24小时的时间范围内,请使用Joda-Time的三个类别中的一个时间跨度:间隔,持续时间和周期。

 Interval interval = new Interval( now, twentyFourHoursFromNow ); boolean isDateTimeInQuestionContainedWithinNext24Hours = interval.contains( dateTimeInQuestion ); 

对于那种比较,Joda-Time使用“半开”逻辑。 这意味着开始日期时间是包含的,而结尾是独占的 。 换句话说,比较大于或等于(> =)开始,但少于(<)结束。 在使用日期时,这种方法通常最有意义。

这将帮助您检查您的日期是否是昨天

 public static final long ONE_MINUTE = 60 * 1000; public static final long ONE_HOUR = 60 * ONE_MINUTE; public static final long ONE_DAY = 24 * ONE_HOUR; public static boolean isYesterday(Date d) { return DateUtils.isToday(d.getTime() + ONE_DAY); } 

找到日期之间的差异:简而言之,

 long endL = end.getTimeInMillis() + end.getTimeZone().getOffset( end.getTimeInMillis() ); long startL = this.getTimeInMillis() + this.getTimeZone().getOffset(this.getTimeInMillis()); return (endL - startL) / MILLISECS_PER_DAY; 

详细地,

http://user.xmission.com/~goodhill/dates/deltaDates.html

在您的活动OnCreate中

  //Get current date - yymmdd increases only SimpleDateFormat formatter = new SimpleDateFormat("yyMMdd"); Date now = new Date(); int nowTime= Integer.parseInt(formatter.format(now)); //Get last login date - stored in db int lastLogin= dbManager.getLastLoginDate(); //Check if next day if(nowTime> lastLogin){ //Do your stuff //Update last login date dbManager.saveLoginDate(nowTime); }