我正在尝试比较java中的两个日历,以确定其中一个是否是> = 24小时前。我不确定实现这一目标的最佳方法。
//get todays date
Date today = new Date();
Calendar currentDate = Calendar.getInstance();
currentDate.setTime(today);
//get last update date
Date lastUpdate = profile.getDateLastUpdated().get(owner);
Calendar lastUpdatedCalendar = Calendar.getInstance();
lastUpdatedCalendar(lastUpdate);
//compare that last hotted was < 24 hrs ago from today?
答案 0 :(得分:15)
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等)已被证明是令人困惑和有缺陷的。避免它们。
对于Java 8及更高版本,请使用Java内置的java.time框架。对于早期的Java,将Joda-Time框架添加到项目中。
您可以轻松地在java.util.Date和任一框架之间进行转换。
Java 8及更高版本中内置的java.time框架取代了棘手的旧java.util.Date/.Calendar类。新课程的灵感来自非常成功的Joda-Time框架,旨在作为其继承者,在概念上类似但重新设计。由JSR 310定义。由ThreeTen-Extra项目扩展。请参阅Tutorial。
Instant
类表示UTC时间轴上的时刻。如果您打算在24小时内提出要求,而不是在一天之内,那么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 ) ;
如果你的意思是&#34;一天&#34;而不是24小时,那么我们需要考虑时区。一天在当地确定,在一个时区内。 Daylight Saving Time (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) );
答案 1 :(得分:9)
你可以使用Date.getTime(),这是一个例子:
public final static long MILLIS_PER_DAY = 24 * 60 * 60 * 1000L;
public static void main(String args[]) throws Exception {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
Date date1 = sdf.parse("2009-12-31");
Date date2 = sdf.parse("2010-01-31");
boolean moreThanDay = Math.abs(date1.getTime() - date2.getTime()) > MILLIS_PER_DAY;
System.out.println(moreThanDay);
}
答案 2 :(得分:0)
您可以根据区域偏移量参数检查localDateTime是否在24小时内显示,如以下示例所示。
@Test
public void checkIsWithin24Hours() {
final ZoneOffset zoneOffset = ZoneOffset.UTC;
final LocalDateTime now = LocalDateTime.now(zoneOffset);
final LocalDateTime after = LocalDateTime.now(zoneOffset).plusHours(5);
final long nowHours = TimeUnit.MILLISECONDS.toHours(now.toInstant(zoneOffset).toEpochMilli());
final long afterFiveHours = TimeUnit.MILLISECONDS.toHours(after.toInstant(zoneOffset).toEpochMilli());
assertThat(afterFiveHours - nowHours <= 24).isTrue();
}