Что управляет отображением смещения часового пояса в GMT в WebLogi c? - PullRequest
0 голосов
/ 19 марта 2020

У меня необычная проблема.

В приложении, развертываемом в Production на Oracle WebLogi c, появилась ошибка. Даты, которые должны быть напечатаны как, например, 24 Mar 00:00:00 EDT 2020, печатаются как 23 Mar 23:00:00 EST 2020.

Другие журналы сервера WebLogi c, не из нашего приложения, также печатаются в EST (восточное стандартное время) вместо EDT (восточное дневное время).

Это происходит только в Производство.

Часовой пояс, который приложение выгружает в свой журнал, является правильным во всех средах (т. Е. "America / New_York"). Я проверил файлы $JRE_HOME/lib/tzdb.dat в обеих средах, и они идентичны.

Кто-нибудь знает, что может быть причиной этого?

1 Ответ

1 голос
/ 19 марта 2020

Настройка часового пояса JVM по умолчанию была изменена

Это предположение, но полностью согласованное. Даты и время, которые печатаются с сокращением часового пояса (EST или EDT), наиболее вероятно, используют часовой пояс по умолчанию JVM. Таким образом, настройка часового пояса по умолчанию была изменена на вашем рабочем сервере WebLogi c. Любая программа, запущенная на сервере, может это сделать. Даже программа, работающая вне WebLogi c в той же JVM, может, если она есть. В любое время.

Часовой пояс по умолчанию устанавливается из системного свойства user.timezone при запуске (или когда программа в JVM впервые что-то делает с часовым поясом, я не уверен). Позднее изменение часового пояса JVM по умолчанию не вернет системное свойство. Для краткой демонстрации:

    System.setProperty("user.timezone", "America/New_York");

    TimeZone.setDefault(TimeZone.getTimeZone("America/Atikokan"));

    System.out.println("TimeZone.getDefault(): " + TimeZone.getDefault().getID());
    System.out.println("user.timezone: " + System.getProperty("user.timezone"));
    System.out.println("Example java.util.Date: " + new Date());

Запуск этого фрагмента на моем компьютере дал следующий вывод:

TimeZone.getDefault(): America/Atikokan
user.timezone: America/New_York
Example java.util.Date: Thu Mar 19 14:18:03 EST 2020

Вы заметили, что user.timezone печатается как America/New_York, но в последней строке упоминается EST, поэтому не согласен с America/New_York, что означало бы EDT, если я не ошибаюсь.

PS Обычно я бы не рекомендовал использовать TimeZone класс в целом, так как он плохо спроектирован и давно устарел. Я нуждался в этом для этой демонстрации, поскольку java .time, современный Java API даты и времени, не предлагает возможность изменить настройку часового пояса JVM (о которой я знаю). Может быть, они сделали мудрый выбор, не включив его, поскольку, как вы можете видеть, выполнение этого может легко вызвать путаницу.

...