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

Zac*_*ano 12 java date

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

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

Ted*_*opp 14

使用该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
Run Code Online (Sandbox Code Playgroud)

  • 您提供使用日历并显示如何从日期转换为日历,但如何检查一个日历是否在另一个之后?仍然没有解决.我需要检查一个日历是从今天开始还是从前一天开始,所以如果你能回答它也会很好. (2认同)
  • 琐碎与否,这就是Zach Sugano所要求的,所以你应该把它包含在你的答案中.关于检查一个日期是否来自前一天(不包括比较)我发现这篇文章http://stackoverflow.com/questions/2517709/java-comparing-two-dates-to-see-if-they-are-in-当天有用. (2认同)

Psh*_*emo 8

答案取决于你想要达到的目标.

一种方法,可以是以毫秒为单位检查差异.可以通过计算24小时(毫秒)

24  *  60  *  60  *  1000   =  86400000
h      min    sec    millis  
Run Code Online (Sandbox Code Playgroud)

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

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

  • 只记得用"long"算术做一切,而不是`int`. (3认同)

Bas*_*que 6

TL;博士

myUtilDate_B
    .toInstant()
    .equals( 
        myUtilDate_A.toInstant().plus( 24 , ChronoUnit.HOURS ) 
    )  // Exactly 24 hours apart.
Run Code Online (Sandbox Code Playgroud)

…和…

myUtilDate_B
    .toInstant()
    .isAfter( 
        myUtilDate_A.toInstant().plus( 24 , ChronoUnit.HOURS ) 
    )  // Over 24 hours apart.
Run Code Online (Sandbox Code Playgroud)

另外...

Duration.between( myUtilDate_A , myUtilDate_B )
        .compareTo( Duration.ofHours( 24 ) )  
        // Returns 0 if exactly 24 hours apart, 
        //         >0 if over 24 hours apart.
Run Code Online (Sandbox Code Playgroud)

java.time

您特别要求比较两个日期时间,询问是否:

  • 比其他人晚24小时
  • 比另一个晚24个小时.

compareTo你提到的方法不会这样做.它旨在仅仅判断一个时刻是相同的,更晚的还是更快的.该方法不关心特定的时间跨度,例如24小时.

您明确指出日期无关紧要.因此,您希望忽略夏令时(DST)等异常情况,这些异常会使一天长于或短于24小时.

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

如果您指的是java.util.Date对象,请先将它们转换为java.time对象.该Date班是麻烦的旧日期时间类,随着的一部分Calendar,这是现在的传统,由java.time类取代.

相当于java.util.Datejava.time.Instant.该Instant级表示时间轴上的时刻UTC,分辨率为纳秒(最多9个(9)小数的位数).

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

Instant start = myUtilDate_Start.toInstant();
Instant stop = myUtilDate_Stop.toInstant();
Run Code Online (Sandbox Code Playgroud)

定义我们关心的差距,在这种情况下,二十四小时,作为一个Duration对象.

Duration d = Duration.ofHours( 24 );  // We mean literally 24 hours, not a day.
Run Code Online (Sandbox Code Playgroud)

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

Instant target = start.plus( 24 , ChronoUnit.HOURS );
Run Code Online (Sandbox Code Playgroud)

最后,比较第二个日期时间值.打电话equalsisAfter.

Boolean isExactly24HoursLater = stop.equals( target );
Boolean isOver24HoursLater = stop.isAfter( target );
Run Code Online (Sandbox Code Playgroud)

关于java.time

java.time框架是建立在Java 8和更高版本.这些类取代麻烦的老传统日期时间类,如java.util.Date,Calendar,和SimpleDateFormat.

现在处于维护模式Joda-Time项目建议迁移到java.time.

要了解更多信息,请参阅Oracle教程.并搜索Stack Overflow以获取许多示例和解释.规范是JSR 310.

从哪里获取java.time类?

ThreeTen-额外项目与其他类扩展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 );
Run Code Online (Sandbox Code Playgroud)

1天≠24小时

如果您真的打算考虑第二天的挂钟时间,请致电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 );
Run Code Online (Sandbox Code Playgroud)

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