我正在尝试迁移一个旧库以使用“新的” 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,我仍然可以使用它,但是可以使用多长时间。