我正在使用Calendar
对象。我使用的时间戳格式使用年,日,小时和分钟。但是,在某些情况下,我需要将这些设置为特定日期的极值。
我可以通过将Calendar.HOUR
和Calendar.MINUTE
设置为0(我认为)来将日历设置为当天的第一个可能时间。
当天最后一分钟的正确值是多少? Calendar.HOUR
设置为23,Calendar.MINUTE
设置为59?
答案 0 :(得分:1)
可怕的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点至下午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
。