【问题标题】:Adding 1 hour to calendar Date doesn´t add the hour将 1 小时添加到日历日期不会添加小时
【发布时间】:2021-11-30 11:07:29
【问题描述】:

我有一个日历对象,我将日期设置为:

calendarObject.setTime(date);

日期是一个日期对象,我打印日期对象并拥有我想要的日期:Sun Oct 31 02:00:00 CEST 2021

然后我想将 1 小时添加到我的日期对象为 31/10/2021 02:00:00 的日历对象,所以我这样做:

calendarObject.add(Calendar.HOUR_OF_DAY, 1);

我再次打印日历对象:

System.out.println(calendarObject.getTime());

并再次显示 Sun Oct 31 02:00:00 CEST 2021 但我想要 Sun Oct 31 03:00:00 但我不知道为什么它不起作用

解决: 问题是 10 月 31 日凌晨 3 点的时区回滚到凌晨 2 点,(当天的小时变化)所以它增加了 1 小时,但在凌晨 3 点,小时再次变为凌晨 2 点。

【问题讨论】:

  • 10 月 31 日凌晨 2 点后 1 小时是 10 月 31 日凌晨 2 点。这是一个时间循环……嗯,不,是夏天结束,时钟倒退的时候。
  • 我只是要把它放在那里......你为什么还在使用Calendar?!是时候(双关语)继续使用经过大幅改进和更新的 java.time API,它可以让您克服这些问题
  • 所以问题是我加了 1 小时,但检测到这是由于夏天而改变的时间,所以它保持相同的时间,因为我加了 1,但系统也在减去1小时? @JoachimSauer
  • 10 月 31 日凌晨 3 点,该时区的时间将回滚到凌晨 2 点。 IE。 当天第二次是凌晨 2 点。这就是夏令时转换的工作方式(或者他们在一天中留下 1 小时的间隙)。尝试再次添加 1 小时,您会发现它现在继续运行... 是的,我同意 @MadProgrammer:使用 java.time,这是一个非常更明智的 API。
  • 是的,解决,问题是你们都在说...在凌晨 3 点时区回滚,我已经解决了一个简单的检查方法,现在我将使用 java.time,谢谢给大家!!

标签: java date calendar


【解决方案1】:

java.time

和其他人一样,我热烈推荐 java.time,现代 Java 日期和时间 API,用于您的日期和时间工作。

    ZonedDateTime dateTime = ZonedDateTime.of(
            2021, 10, 31, 2, 0, 0, 0, ZoneId.of("Europe/Berlin"));
    System.out.println(dateTime);

    dateTime = dateTime.plusHours(1);
    System.out.println(dateTime);

    dateTime = dateTime.plusHours(1);
    System.out.println(dateTime);

输出:

2021-10-31T02:00+02:00[Europe/Berlin]
2021-10-31T02:00+01:00[Europe/Berlin]
2021-10-31T03:00+01:00[Europe/Berlin]

如果不是欧洲/柏林,请替换您想要的时区。 CEST 是夏季 (DST) 期间使用的常用缩写,表示一长串北极、欧洲和非洲时区在夏季时间偏移 +02:00(其中大部分在标准时间 +01:00)。

正如其他人所说,在今年 10 月 30 日至 31 日的晚上,大部分提到的时区都从夏令时转换为标准时间。当时钟快要到 03:00 时,却被调回了 02:00。因此,当您在 02:00(夏令时)上增加一个小时时,您应该得到 - 嗯,02:00(标准时间)。在上面的输出中,您可以区分夏令时使用偏移 +02:00 和标准时间使用 +01:00。从标准时间 02:00 开始,时间照常向前移动。直到三月,疯狂重复,只是相反。当我们再增加一小时时,我们确实得到了预期的 03:00 标准时间。

链接:Oracle Tutorial: Date Time 展示了 java.time 的使用。

【讨论】:

    猜你喜欢
    • 2019-08-31
    • 2021-10-13
    • 1970-01-01
    • 2017-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多