比较日期是否少于24小时

Bis*_*128 12 java calendar

我试图比较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?
Run Code Online (Sandbox Code Playgroud)

Bas*_*que 17

TL;博士

Instant now = Instant.now();
Boolean isWithinPrior24Hours = 
    ( ! yourJUDate.toInstant().isBefore( now.minus( 24 , ChronoUnit.HOURS) ) ) 
    && 
    ( yourJUDate.toInstant().isBefore( now ) 
) ;
Run Code Online (Sandbox Code Playgroud)

细节

旧的日期时间类(java.util.Date/.Calendar,java.text.SimpleDateFormat等)已被证明是令人困惑和有缺陷的.避免他们.

对于Java 8及更高版本,请使用Java内置的java.time框架.对于早期的Java,将Joda-Time框架添加到项目中.

您可以轻松地在java.util.Date和任一框架之间进行转换.

java.time

Java 8及更高版本中内置的java.time框架取代了麻烦的旧java.util.Date/.Calendar类.新课程的灵感来自非常成功的Joda-Time框架,旨在作为其继承者,在概念上类似但重新设计.由JSR 310定义.由ThreeTen-Extra项目扩展.请参阅教程.

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 ) ;
Run Code Online (Sandbox Code Playgroud)

如果你的意思是"一天"而不是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 ) ;
Run Code Online (Sandbox Code Playgroud)

另一种方法是使用IntervalThreeTen-Extra项目中的类.该类代表一对Instant对象.该类提供诸如contains执行比较的方法.

乔达时间

乔达时库的作品以类似的方式来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 );
Run Code Online (Sandbox Code Playgroud)

或者,在一行中:

boolean isBeforeYesterday = new DateTime( yourDate).isBefore( DateTime.now().minusDays(1) );
Run Code Online (Sandbox Code Playgroud)


osc*_*ter 11

你可以使用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);
}
Run Code Online (Sandbox Code Playgroud)