Я пытаюсь перенести старую библиотеку, чтобы использовать «новый» API времени Java и бороться за одну точку.
Контекст
Я довольно давно разработал приложение для работы с графиками в банковской сфере. Таким образом, у вас есть непрерывный поток цен, и вы агрегируете их по 1-дневным свечам (например) с открытием, максимумом, минимумом и закрытием.
Основная проблема возникла из-за того, что графики должны отображать свечи только тогда, когда рынок открыт. Для форекса это означает, что с воскресенья 17:00 по Нью-Йорк до пятницы 17:00 по Нью-Йорк Так что день начинается в 17:00 по нью-йоркскому времени, и ваши свечи должны отражать это, даже если вы живете в Женеве.
То, как я делал это со старым API «Java Time», заключалось в создании собственного часового пояса (см. Код ниже)
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, Нью-Йорк . Это очень помогает во всех вычислениях знать, какой сегодня день. И я автоматически получаю летнее время правильно.
Проблема:
Я не нашел способа сделать то же самое с "новым" API времени. Классы либо окончательны, либо защищены пакетами, поэтому я не могу создать собственную часовую зону. Я везде пытался найти, делал ли кто-то что-то подобное в прошлом, но ничего не нашел.
Я обнаружил, что могу создать новую ZoneRules для создания своего собственного ZoneId, но невозможно использовать начальные ZoneRules (для Нью-Йорка), чтобы получить начальные параметры для его подачи (почему это не интерфейс, который я мог бы "украсить" «). Единственное решение, которое я вижу, - использовать «отражение» для чтения полей NY ZoneRules.
Был бы способ сделать это чисто?
Конечно, пока есть "старый" API, я все еще могу его использовать, но как долго.