如何在Java中使用日历跳过时区更改?

3

我在使用日历时遇到了跳过时区的问题。 我的问题描述如下: 我有一个从“x”日期开始的事件,我需要添加小时数,但不改变时钟时间。 例如,如果我的事件是2019-03-09 22:46:00,并且我添加2400小时(100天),我的输出将是“2019-06-17 23:46:00”,因为时区改变了。我需要输出为2019-06-17 22:46:00。 我该如何使用日历来实现? calendar = 我的第一个事件日期 calendar2 = 在第一个日历基础上添加小时后返回我的下一个事件的日期。

while (calendar.compareTo(calendar2) < 0) {
            calendar.add(Calendar.HOUR_OF_DAY, nr_hours);
        }
        nextEvent =sdf.format(calendar.getTime());
        return nextEvent;

4
这是一个很好的例子,说明为什么不要使用Calendar;它有各种问题,而且已经过时了。请使用LocalDateTime - chrylis -cautiouslyoptimistic-
如果你真的需要一个时区或者UTC偏移量,那么请使用ZonedDateTime或者OffsetDateTime - deHaar
1个回答

3

总结

LocalDateTime
.parse( "2019-03-09T22:46:00" )
.plus( 
    Duration.ofDays( 100 )
)

查看这段代码在IdeOne.com上实时运行

例如,如果我的事件是2019-03-09 22:46:00,并且我添加2400小时(100天),我的输出将是“2019-06-17 23:46:00”,因为时区已更改。

你明白吗?在你特定的时区中,17日晚上11点确实比9日晚上10点晚2400个小时。如果您报告结束时间为该时区的晚上10点,则读者会将您的结果解释为开始后2399小时的时刻。


永远不要使用可怕的类CalendarDate。这些遗留类早在多年前就被现代的java.time类(定义在JSR 310中)所取代。


如果您确定要忽略时区更改的现实,请使用LocalDateTime

LocalDateTime start = LocalDateTime.parse( "2019-03-09T22:46:00" ) ;
Duration d = Duration.ofDays( 100 ) ;  // Days in `Duration` are generic 24 hours chunk of time without regard for dates and calendar. Same effect as `Duration.ofHours( 2_400 )`.
LocalDateTime end = start.plus( d ) ;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接