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

Java 哪些日历值对应于一天的最后一小时/分钟?,java,calendar,Java,Calendar,我正在使用日历对象。我使用的时间戳格式使用年、日、小时和分钟。但是,在某些情况下,我需要将这些设置为给定日期的极值 我可以通过将Calendar.HOUR和Calendar.MINUTE设置为0(我想),将日历设置为一天中第一个可能的时间 一天中最后一分钟的正确值是多少日历.HOUR设置为23,日历.MINUTE设置为59?一句话-是。 一天的最后一分钟将小时设置为23,分钟设置为59。它以设置为0的秒开始,以设置为59的秒结束 可怕的Calendar和gregorianalendar在几年前被

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

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

一天中最后一分钟的正确值是多少<代码>日历.HOUR设置为23,日历.MINUTE设置为59?

一句话-是。 一天的最后一分钟将小时设置为
23
,分钟设置为
59
。它以设置为
0
的秒开始,以设置为
59
的秒结束 可怕的
Calendar
gregorianalendar
在几年前被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.999999

一般来说,最好使用定义为半开放的时间跨度。这意味着开始是包含的,而结束是独占的。例如,当我们说学生的午休时间是中午到下午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 ) ;
要将此时间跨度表示为附加到时间轴的一对时刻,请将库添加到项目中。然后使用它的
Interval
类。通过提取一个
Instant
对象,将每个
ZoneDateTime
调整为UTC<代码>瞬间表示UTC中的一个时刻

Interval interval = Interval.of( 
    zdtFirstMoment.toInstant() , 
    zdtFirstMomentNextDay.toInstant() 
) ;
如果必须具有
日历
对象,请使用添加到旧类中的新转换方法从
ZoneDateTime
转换。在本例中,
gregoriacalendar.from()


使用
HOUR\u OF \u DAY
@argetman而不是HOUR?为什么?请看或。它看起来像SimpleDateFormat本身有1:00=凌晨1点,24:00=午夜。它似乎在一个小时内没有使用0。@user6261756 Yes。查看
HOUR
HOUR\u的定义差异
Calendar c = GregorianCalendar.from( zdtFirstMomentNextDay ) ;