检查一个日期是否恰好是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.Instant
。 Instant
类表示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.Date
, Calendar
和SimpleDateFormat
。
现在处于维护模式的Joda-Time项目建议迁移到java.time。
要了解更多信息,请参阅Oracle教程 。 并搜索Stack Overflow以获取许多示例和解释。 规范是JSR 310 。
从哪里获取java.time类?
- Java SE 8和SE 9及更高版本
- 内置。
- 带有捆绑实现的标准Java API的一部分。
- Java 9增加了一些小function和修复。
- Java SE 6和SE 7
- 许多java.timefunction都被反向移植到ThreeTen-Backport中的 Java 6和7。
- Android的
- ThreeTenABP项目特别适用于Android的ThreeTen-Backport (如上所述)。
- 请参阅如何使用….
ThreeTen-Extra项目使用其他类扩展了java.time。 该项目是未来可能添加到java.time的试验场。 您可以在这里找到一些有用的课程,如Interval
, YearWeek
, YearQuarter
等。
乔达时间
更新:现在处于维护模式的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;
详细地,
在您的活动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); }