tl;博士
Instant now = Instant.now();
Boolean isWithinPrior24Hours =
( ! yourJUDate.toInstant().isBefore( now.minus( 24 , ChronoUnit.HOURS) ) )
&&
( yourJUDate.toInstant().isBefore( now )
) ;
详
旧的日期时间类 (java.util.Date/.Calendar, java.text.SimpleDateFormat, etc.)已被证明是令人困惑和有缺陷的。避免它们。
对于 Java 8 及更高版本,请使用 Java 中内置的 java.time 框架。对于早期的 Java,将 Joda-Time 框架添加到项目中。
您可以轻松地在java.util.Date和任一框架之间进行转换。
java.time
Java 8 和后来的 java.time 框架取代了麻烦的旧 java.util.Date/。日历类。新类的灵感来自非常成功的Joda-Time框架,旨在作为其继任者,在概念上相似,但重新构建。由 JSR 310 定义。由ThreeTen-Extra项目扩展。请参阅教程。
该类以 UTC 格式表示时间轴上的某个时刻。如果你的意思是要求字面上的24小时而不是“一天”,那么这就是我们所需要的。Instant
Instant
Instant then = yourJUDate.toInstant();
Instant now = Instant.now();
Instant twentyFourHoursEarlier = now.minus( 24 , ChronoUnit.HOURS );
// Is that moment (a) not before 24 hours ago, AND (b) before now (not in the future)?
Boolean within24Hours = ( ! then.isBefore( twentyFourHoursEarlier ) ) && then.isBefore( now ) ;
如果您指的是“一天”而不是24小时,那么我们需要考虑时区。一天是在某个时区内本地确定的。夏令时 (DST) 和其他异常意味着一天并不总是 24 小时长。
Instant then = yourJUDate.toInstant();
ZoneId zoneId = ZoneId.of( "America/Montreal" );
ZonedDateTime now = ZonedDateTime.now( zoneId );
ZonedDateTime oneDayAgo = now.minusDays( 1 );
Boolean within24Hours = ( ! then.isBefore( oneDayAgo ) ) && then.isBefore( now ) ;
另一种方法是使用ThreeTen-Extra项目中找到的类。该类表示一对对象。该类提供了诸如执行比较之类的方法。Interval
Instant
contains
城大时间
Joda-Time库的工作方式与java.time类似,是它的灵感来源。
DateTime dateTime = new DateTime( yourDate ); // Convert java.util.Date to Joda-Time DateTime.
DateTime yesterday = DateTime.now().minusDays(1);
boolean isBeforeYesterday = dateTime.isBefore( yesterday );
或者,在一行中:
boolean isBeforeYesterday = new DateTime( yourDate).isBefore( DateTime.now().minusDays(1) );