繁体   English   中英

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

[英]Which Calendar values corresponds to the last hour/minute of the day?

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

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

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

时间

可怕的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 点时,我们的意思是他们应该在钟声响起之前把他们的垫子放在座位上。 因此,午餐从 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类。 通过提取Instant对象将每个ZonedDateTime调整为 UTC。 Instant表示 UTC 中的一个时刻。

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

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

Calendar c = GregorianCalendar.from( zdtFirstMomentNextDay ) ;

一句话—​​—是的。 一天的最后一分钟将小时设置为23 ,将分钟设置为59 它以秒数设置为0开始,以秒数设置为59结束。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM