Java Time: создайте свой собственный часовой пояс - PullRequest
0 голосов
/ 09 ноября 2018

Я пытаюсь перенести старую библиотеку, чтобы использовать «новый» 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, я все еще могу его использовать, но как долго.

...