Java时间:创建自己的时区

时间:2018-11-09 11:02:33

标签: java time timezone java-time

我正在尝试迁移一个旧库以使用“新的” Java time API并在一个方面苦苦挣扎。

上下文

我现在开发了相当一段时间的应用程序,用于处理银行业中的图表。因此,您会有持续不断的价格流向,并通过开盘价,最高价,最低价和收盘价(例如)汇总一天的蜡烛。

主要问题在于,图表仅在市场开放时才需要显示蜡烛。对于外汇,这意味着从周日17:00 NY到周五17:00 NY。因此,这一天从纽约时间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"
  // ...
}

通过致电:

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

我得到一个时区,其中星期一午夜实际上是星期日17:00 NY 。这极大地帮助了所有计算来知道是哪一天。而且我会自动正确获取夏令时。

问题:

我没有找到使用“新”时间API的方法。这些类是final或包保护的,因此我无法创建自己的TimeZone。我试图在任何地方找到某个人过去是否曾经做过类似的事情,但是什么也没找到。

我发现我可以创建一个新的ZoneRules来创建自己的ZoneId,但是无法使用初始的ZoneRules(用于NY)来获取初始参数来进行馈送(为什么它不是我可以“装饰”的接口”)。我看到的唯一解决方案是使用“反射”读取NY ZoneRules字段。

有没有办法做到这一点?

当然,只要有“旧” API,我仍然可以使用它,但是可以使用多长时间。

0 个答案:

没有答案