[英]Which Calendar values corresponds to the last hour/minute of the day?
我正在使用Calendar
对象。 我使用的时间戳格式使用年、日、小时和分钟。 但是,在某些情况下,我需要将这些设置为给定日期的极端值。
通过将Calendar.HOUR
和Calendar.MINUTE
设置为 0(我认为),我可以将日历设置为一天中的第一个可能时间。
当天最后一分钟的正确值是多少? Calendar.HOUR
设置为 23, Calendar.MINUTE
设置为 59?
可怕的Calendar
和GregorianCalendar
多年前被 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.