哪些日历值对应于当天的最后一小时/分钟?

时间:2016-04-28 17:47:27

标签: java calendar

我正在使用Calendar对象。我使用的时间戳格式使用年,日,小时和分钟。但是,在某些情况下,我需要将这些设置为特定日期的极值。

我可以通过将Calendar.HOURCalendar.MINUTE设置为0(我认为)来将日历设置为当天的第一个可能时间。

当天最后一分钟的正确值是多少? Calendar.HOUR设置为23,Calendar.MINUTE设置为59?

2 个答案:

答案 0 :(得分:1)

java.time

可怕的CalendarGregorianCalendar几年前被JSR 310中定义的现代 java.time 类所取代。

要获取一天的第一时刻,请从仅日期的LocalDate开始。

LocalDate ld = LocalDate.of( 2019 , Month.JANUARY , 23 ) ;

要考虑时间,我们必须有一个时区。日子并非总是从00:00:00开始。在某些区域的某些日期,一天的开始时间可能是01:00:00。因此,让 java.time 确定感兴趣的时区是一天的第一时刻。

ZoneId z = ZoneId.of( "America/Montreal" ) ;
ZonedDateTime zdtFirstMoment = ld.atStartOfDay( z ) ;  

对于一天的最后时刻,这是有问题的。最后一小时的最后一分钟的最后一秒的分数是无限可分的。它可能类似于23:59:59.999或23:59:59.999999或23:59:59.999999999。

通常,最好将时间跨度定义为“半开”。这意味着开始是包含,而结束是包含。例如,当我们说学生的午休时间是中午1点至下午1点时,我们的意思是说他们应该在敲钟之前在他们的座位上吃寿司。因此,午餐从12:00:00.0开始,一直持续到但不包括13:00:00.0。同样,一周从星期一开始,一直持续到(但不包括)下一个星期一。

ZonedDateTime zdtFirstMomentNextDay = zdtFirstMoment.plusDays( 1 ) ;

如果您坚持要在一天中的最后一分钟,请从第一时刻减去一分钟。

ZonedDateTime zdtLastMinute = zdtFirstMomentNextDay.minusMinutes( 1 ) ;

一天并非总是24小时。它可以是23、23.5、25或其他小时数。要计算经过的时间,请使用Duration

Duration d = Duration.between( zdtFirstMoment , zdtFirstMomentNextDay ) ;

要将这段时间跨度表示为附加在时间线上的一对时刻,请将ThreeTen-Extra库添加到项目中。然后使用其Interval类。通过提取ZonedDateTime对象,将每个Instant调整为UTC。 Instant代表UTC的时刻。

Interval interval = Interval.of( 
    zdtFirstMoment.toInstant() , 
    zdtFirstMomentNextDay.toInstant() 
) ;

如果必须具有Calendar对象,请使用添加到旧类中的新转换方法从ZonedDateTime进行转换。在这种情况下,GregorianCalendar.from()

Calendar c = GregorianCalendar.from( zdtFirstMomentNextDay ) ;

答案 1 :(得分:0)

总之 - 是的。 当天的最后一分钟将小时设置为23,将分钟设置为59。它以设置为0的秒数开始,最后设置为59