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

时间:2012-06-21 20:59:24

标签: java date

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

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

6 个答案:

答案 0 :(得分:13)

使用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

答案 1 :(得分:7)

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

一种方法,可以检查以毫秒为单位的差异。可以通过

计算24小时(毫秒)
24  *  60  *  60  *  1000   =  86400000
h      min    sec    millis  

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

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

答案 2 :(得分:5)

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)等异常现象,这些异常可以使一天更长或更短的时间。

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

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

相当于java.util.Datejava.time.InstantInstant类代表UTC中时间轴上的一个时刻,分辨率为nanoseconds(小数部分最多九(9)位)。

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

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

将我们关心的差距定义为二十四小时,作为Duration对象。

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

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

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

最后,比较第二个日期时间值。致电equalsisAfter

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

关于java.time

java.time框架内置于Java 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.DateCalendar和& SimpleDateFormat

现在位于Joda-Timemaintenance mode项目建议迁移到java.time。

要了解详情,请参阅Oracle Tutorial。并搜索Stack Overflow以获取许多示例和解释。规范是JSR 310

从哪里获取java.time类?

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


约达时间

更新:现在位于Joda-Timemaintenance mode项目建议迁移到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小时

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

24小时内比较

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

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

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

答案 3 :(得分:1)

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

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);
} 

答案 4 :(得分:0)

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

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

答案 5 :(得分:0)

在您的活动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);
    }