Как получить zoneoffset по умолчанию в java8?

С java8 мы знаем, использовать ZoneId.default() может получить систему по умолчанию ZoneId, но как получить default ZoneOffset?

Я вижу, что a ZoneId имеет некоторые "правила", и каждое правило имеет ZoneOffset, что означает ZoneId может иметь более одного ZoneOffset?

1 ответов


tl; dr

OffsetDateTime.now().getOffset()

смещение против часового пояса

An смещение от-UTC - это всего лишь количество часов, минут и секунд - не более.

A часовой пояс это история смещений для конкретного региона плюс набор правил для обработки аномалий, таких как летнее время (DST) это вызывает сдвиги смещения в течение определенных периодов времени.

время Zone = (история смещений + правила для аномалий )

так лучше использовать зоны когда известно.

смещение для любой области изменяется с течением времени. Например, DST в Соединенных Штатах смещает смещение на час в течение примерно половины года, а затем восстанавливает этот час обратно в смещение в течение другой половины года. Вся цель часового пояса-документировать эти сдвиги в смещении.

так это действительно нет смысла запрашивать смещение без даты-времени. В America/Los_Angeles, например, в части этого года смещение -08:00 но в другой части года -07:00 во время перехода на летнее время.

OffsetDateTime

поэтому давайте определим момент как OffsetDateTime, а затем извлеките ZoneOffset.

OffsetDateTime odt = OffsetDateTime.now ();
ZoneOffset zoneOffset = odt.getOffset ();

файлы odt.toString(): 2017-01-02T15:19:47.162-08:00

zoneoffset в.toString (): -08: 00

это now метод фактически применяет неявно текущий часовой пояс JVM по умолчанию. Я предлагаю вам всегда делать это явным, указывая желаемый / ожидаемый часовой пояс. Даже если вы хотите текущую зону по умолчанию, скажите это явно, чтобы сделать ваши намерения ясными. Устраните двусмысленность относительно того, намеревались ли вы по умолчанию или не смогли рассмотреть часовой пояс, как это часто бывает с программистами. Вызов ZoneId.systemDefault.

OffsetDateTime odt = OffsetDateTime.now ( ZoneId.systemDefault () );
ZoneOffset zoneOffset = odt.getOffset ();

ZoneId.systemDefault().toString (): America/Los_Angeles

odt: 2017-01-02T15:19:47.162-08:00

zoneOffsetOfOdt: -08:00

предупреждение о зависимости от зоны по умолчанию: это значение по умолчанию может быть изменено в любой момент любым кодом в любом потоке в JVM. Если важно, спросите пользователя о предполагаемом часовом поясе.

вы можете попросить смещение для своего время как общее количество секунд.

int offsetSeconds = zoneOffset.getTotalSeconds ();

offsetSeconds: -28800

ZonedDateTime

другой пример: возможно, вы хотите знать, что смещение будет на Рождество в этом году в Квебеке. Укажите часовой пояс America/Montreal, получаем ZonedDateTime, попросите его смещение как , теперь режим обслуживания, советует миграцию в java.время классы.

чтобы узнать больше, см. В Oracle Учебник. И search Stack Overflow для многих примеров и объяснений. Спецификация в JSR 310.

вы можете обменять java.время объекты непосредственно с вашей базой данных. Используйте драйвер JDBC соответствуют JDBC 4.2 или позже. Нет необходимости в строках, нет необходимости в java.sql.* классы.

где получить java.время занятий?

  • Java SE 8, Java SE 9, Java SE 10, Java SE 11, а позже-часть стандартного API Java с встроенной реализацией.
    • Java 9 добавляет некоторые незначительные функции и исправления.
  • Java SE 6 и Java SE 7
    • большая часть java.функциональность времени обратно портирована на Java 6 & 7 в ThreeTen-Backport.
  • Android

на ThreeTen-Extra проект расширяет java.время с дополнительными занятиями. Этот проект является испытательной площадкой для возможных будущих дополнений к java.время. Здесь вы можете найти полезные классы, такие как Interval, YearWeek, YearQuarter и больше.