Почему Java производит час позади Касабланки в реальном времени? - PullRequest
3 голосов
/ 20 февраля 2020

Во время написания некоторых экспериментов на Java Data / Time API. Мне было интересно, почему этот код не работает должным образом:

ZonedDateTime CasaNow = ZonedDateTime.now(ZoneId.of("Africa/Casablanca"));
System.out.println(CasaNow);
// 2020-02-20T11:32:28.063419Z[Africa/Casablanca]

Я ожидал, что он напечатает "2020-02-20T 12: 32: 28 .063419Z [Африка / Касабланка] "как в моих часах.

Это точное время в Касабланке , но программа отстает от этого времени на час. Что я делаю не так?

Обновление

Информация JDK:

java 11.0.1 2018-10-16 LTS
Java(TM) SE Runtime Environment 18.9 (build 11.0.1+13-LTS)
Java HotSpot(TM) 64-Bit Server VM 18.9 (build 11.0.1+13-LTS, mixed mode)

Конфигурация локали операционной системы:

locale configuration of the operating system

1 Ответ

1 голос
/ 20 февраля 2020

Насколько я понимаю, с 2018 года Марокко работает по UTC + 01: 00, за исключением того, что по смещению +00: 00 (часто записывается как Z) в течение месяца Рамадан. Таким образом, вы правы: получение времени в UT C (Z) сегодня неожиданно, поскольку Рамадан не начинается до конца апреля по григорианскому.

Согласно BB C Марокко в октябре 2018 года ( 1 год 4 месяца go на момент написания) решил остаться на прежнее летнее время (DST) также зимой. Таким образом, я предполагаю, что Стивен C является правильным в комментарии, база данных часовых поясов в вашей Java установке старше октября 2018 года. Java поэтому предполагает стандартное время сейчас и неправильно дает вам время в UT C.

За то, что стоит, я только что получил 2020-02-20T19:08:47.375Z[Africa/Casablanca] на Java 8 и 2020-02-20T20:06:43.174686+01:00[Africa/Casablanca] на Java 11. Так что, похоже, мой Java 8 до октября 2018 года, а мой Java 11 новее. Насколько я помню, ни у одного из них не обновлялась база данных часовых поясов после того, как я их установил.

Средство обновления часовых поясов

Поскольку вы используете Oracle Java решение состоит в том, чтобы обновить базу данных часовых поясов Java с помощью инструмента обновления часовых поясов. Смотрите ссылку внизу и следуйте приведенным там инструкциям. Однако было несколько вопросов о переполнении стека по поводу сбоя этого инструмента, поэтому я надеюсь, что вы справитесь. В крайнем случае следует установить совершенно новую среду выполнения Java.

Ссылки

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...