【问题标题】:Java 8 ZonedDateTime instance creation at the ending of daylight saving [duplicate]在夏令时结束时创建 Java 8 ZonedDateTime 实例 [重复]
【发布时间】:2017-09-26 03:36:54
【问题描述】:

以欧洲芬兰赫尔辛基为例,夏令时结束于Sunday, 2017 October 29, 4:00 am

我正在寻找一种方法来创建具有正确的 DST 设置(见下文)的 ZonedDateTime 实例,希望通过现有的工厂静态方法。

ZonedDateTime beforeDst = ZonedDateTime.of(2017, 10, 29, 3, 59, 0, 0, ZoneId.of("Europe/Helsinki"));
// this will print: 2017-10-29T03:59+03:00[Europe/Helsinki]

beforeDst.plusMinutes(1);
// this will print: 2017-10-29T03:00+02:00[Europe/Helsinki]
// note the +3 become +2, and 3:59 become 3:00

问题:我们如何创建将打印2017-10-29T03:00+02:00ZonedDateTime

  • 希望通过传入 LocalDateTime 作为参数或类似上述示例的参数,
  • 没有加/删除日期操作,并且
  • 字符串解析不是一个选项(没有java.time.format.DateTimeFormatter)。

【问题讨论】:

标签: java java-8 dst zoneddatetime


【解决方案1】:

请阅读文档,即ZonedDateTime的javadoc:

对于 Overlaps,一般的策略是如果本地日期时间落在 Overlap 的中间,那么将保留之前的偏移量。如果没有先前的偏移量,或者先前的偏移量无效,则使用较早的偏移量,通常是“夏季”时间。另外两个方法,withEarlierOffsetAtOverlap()withLaterOffsetAtOverlap(),有助于管理重叠的情况。

为您的示例显示此代码:

ZonedDateTime zdt = ZonedDateTime.of(2017, 10, 29, 3, 00, 0, 0, ZoneId.of("Europe/Helsinki"));
ZonedDateTime earlier = zdt.withEarlierOffsetAtOverlap();
ZonedDateTime later = zdt.withLaterOffsetAtOverlap();
System.out.println(zdt);
System.out.println(earlier); // unchanged
System.out.println(later);

输出

2017-10-29T03:00+03:00[Europe/Helsinki]
2017-10-29T03:00+03:00[Europe/Helsinki]
2017-10-29T03:00+02:00[Europe/Helsinki]

【讨论】:

    【解决方案2】:

    使用withLaterOffsetAtOverlap() 方法:

    ZonedDateTime zdt = ZonedDateTime.of(2017, 10, 29, 3, 0, 0, 0,
         ZoneId.of("Europe/Helsinki"));
    zdt = zdt.withLaterOffsetAtOverlap();
    
    System.out.println(zdt); // 2017-10-29T03:00+02:00[Europe/Helsinki]
    

    【讨论】:

      猜你喜欢
      • 2018-08-07
      • 1970-01-01
      • 2013-05-16
      • 2018-07-06
      • 2011-08-01
      • 1970-01-01
      • 2013-05-16
      • 2016-01-28
      • 2017-03-18
      相关资源
      最近更新 更多