首页 > 解决方案 > 如何在给定自定义 ZoneRules 的情况下创建 ZoneId

问题描述

希望能够创建从特定区域偏移的自定义时区(但要观察夏令时转换)。例如希望能够表明:

ZoneId.of("America/New_York+7")

上述区域将观察 EST 或 EDT,具体取决于夏令时 + 7 小时。此申请与外汇市场开始/结束(纽约时间下午 5 点)有关。

ZoneId 中不允许使用上述偏移格式,因为 ZoneId 仅允许从 UTC 偏移。

我已经实现了一个生成 custom 的类ZoneRules,但是ZoneRegion构造函数 ZoneId 的子类不是公共的。ZoneRegion 具有以下不可用的构造函数:

ZoneRegion(String name, ZoneRules rules)

所以问题是,除了不使用 java.time 库之外,有没有办法使用 DST 规则获得自定义区域的行为?或者,有人知道如何使用 Joda 日期/时间库来完成这项工作吗?

附录

请注意,由于 ZoneId 中有以下代码,因此无法创建 ZoneId 的子类(坦率地说,这似乎是一个非常糟糕的主意,除非有一些我无法理解的安全原因):

/**
 * Constructor only accessible within the package.
 */
ZoneId() {
    if (getClass() != ZoneOffset.class && getClass() != ZoneRegion.class) {
        throw new AssertionError("Invalid subclass");
    }
}

标签: javatime

解决方案


推荐阅读