Java时间:创建自己的时区

Joh*_*non 6 java time timezone java-time

我正在尝试迁移旧库以使用"新"Java时间API并在一点上挣扎.

上下文

我现在开发了一段时间用于处理银行业图表的应用程序.所以你有一个连续的价格流,你将它们聚合1天蜡烛(例如),开放,高,低和收盘.

主要问题在于图表只有在市场开放时才需要显示蜡烛.对于外汇,这意味着从纽约周日17:00到纽约周五17:00.所以这一天从纽约时间17:00开始,即使你住在日内瓦,你的蜡烛也需要反映出来.

我使用旧的"Java Time"API执行此操作的方法是创建自己的时区(请参阅下面的代码)

public class RelativeTimezone extends TimeZone {
  private final TimeZone zone;
  private final int addedTime;

  public RelativeTimezone(String id, TimeZone zone, int addedTime) {
    this.zone = zone;
    this.addedTime = addedTime;
    setID(id);
  }

  public final int getAddedTime() {
    return this.addedTime;
  }

  @Override
  public int getRawOffset() {
    return this.zone.getRawOffset() + this.addedTime;
  }

  @Override
  public void setRawOffset(int offsetMillis) {
    this.zone.setRawOffset(offsetMillis - this.addedTime);
  }

  // Other overriding methods that simply forward to "this.zone"
  // ...
}
Run Code Online (Sandbox Code Playgroud)

致电:

TimeZone forexTimezone = new RelativeTimezone("NY+7", 
      TimeZone.getTimeZone("America/New_York"), 7 * 3_600_000L)
Run Code Online (Sandbox Code Playgroud)

我得到一个时区,其中星期一午夜实际上是周日17:00 NY.这有助于所有计算知道它是哪一天.我会自动正确地获得夏令时.

问题:

我没有找到一种方法来使用"新"时间API做同样的事情.这些类要么是最终的,要么是包保护的,所以我无法创建自己的TimeZone.我试图找到所有地方,如果有人在过去做了类似的事情,但没有找到任何东西.

我发现我可以创建一个新的ZoneRules来创建我自己的ZoneId,但不可能使用初始的ZoneRules(对于NY)来获取初始参数来提供它(为什么它不是一个我可以"装饰"的界面).我看到的唯一解决方案是使用"reflexion"来读取NY ZoneRules字段.

有没有办法干净地做到这一点?

当然,只要有"旧"API,我仍然可以使用它,但需要多长时间.