JVM и часовые пояса - PullRequest
       0

JVM и часовые пояса

11 голосов
/ 15 августа 2011

У меня проблема с часовыми поясами Java, если кто-нибудь может мне помочь.

У меня есть веб-приложение, работающее на tomcat 5.5 (не уверен, что это актуально), со следующей версией JVM

[someuser@webserver bin]$ java -version
java version "1.5.0_06"
Java(TM) 2 Runtime Environment, Standard Edition (build 1.5.0_06-b05)
Java HotSpot(TM) Server VM (build 1.5.0_06-b05, mixed mode)
[someuser@webserver bin]$

Системная дата, скажем, -

[someuser@webserver bin]$ date
Mon Aug 15 09:09:46 EST 2011

В веб-приложении я в определенный момент звоню на Calendar.getInstance().getTime() и печатаю эту метку времени в журналах.

Проблема в том, что эта метка времени возвращается в EDT, хотя время серверанаходится в EST.По этой причине возвращаемая дата на 1 час позже, чем должна.

Я хочу добиться, чтобы Calendar.getInstance().getTime() вернул дату в том же часовом поясе, что и система.

У меня естьискал форумы и нашел несколько предложений о том, что jvm неправильно читает часовой пояс системы.Я попытался запустить tomcat с параметром -Duser.timezone=EST, но система продолжает возвращать временные метки в часовом поясе EDT.Обратите внимание - попытка -Duser.timezone с не-est параметром, похоже, работает.Проблемы, похоже, имеют другую природу.

Моя проблема как-то похожа на этот вопрос .Однако я только пытаюсь получить дату в том же часовом поясе, в котором находится система, без какой-либо специальной обработки.

Вы можете помочь?

Ответы [ 7 ]

7 голосов
/ 26 апреля 2013

У меня была такая же проблема. Оказывается, для меня Java искала в файле /etc/sysconfig/clock, а не в файле /etc/localtime. Это это для комментария для больше информации

5 голосов
/ 15 августа 2011

EST и EDT очень специфичны, и один из них всегда будет «неправильным» в зависимости от времени года. Попробуйте часовой пояс "Америка / Нью-Йорк", чтобы просто узнать, сколько времени в Нью-Йорке.

* 1003 Е.Г. *

    DateFormat formatterET = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss zzz");
    formatterET.setTimeZone(TimeZone.getTimeZone("America/New_York"));

    String timestamp = formatterET.format(new Date());

Список полезных часовых поясов:

https://calendar.york.ac.uk/en/chcncpt.html#wp1056628

3 голосов
/ 15 августа 2011

Это довольно просто, добавьте это в основной метод вашего приложения (или контекст сервлета):

TimeZone.setDefault( TimeZone.getTimeZone("GMT-4") );

Устанавливает часовой пояс для всех дат в вашей системе.

2 голосов
/ 01 ноября 2017

У меня была такая же проблема на сервере Ubuntu, и я не могу найти файл / etc / sysconfig / clock.

Я решил, что используйте timedatectl для установки часового пояса.

sudo timedatectl set-timezone America/New_York
2 голосов
/ 28 августа 2012

Я не уверен, возможно ли это на Java, но если это так, то это определенно не тот фактический способ действий, о котором говорили другие. См. здесь для примечаний Oracle по этому вопросу, в частности:

Данные о часовом поясе платформы Java SE не считываются из локальной или хост-операционной системы (ОС), поэтому исправления часового пояса ОС не будут обновлять данные о часовом поясе программного обеспечения JRE.

1 голос
/ 01 сентября 2014

В Linux это немного раздражает, потому что долгое время Java (по крайней мере, Oracle / Sun Java) использовала неисправный метод (ну, я полагаю, он был менее неисправен, когда запускался, но все изменилось.)

Моя лучшая рекомендация - установить переменную окружения TZ, так как это первое, что он будет искать;другие места, где он будет выглядеть (например, / etc / sysconfig / clock, / etc / localtime) неисправны.У меня есть более подробный пост об этом в http://distracted -it.blogspot.co.nz / 2014/09 / dont-let-java-on-linux-define-its.html , который включает в себя некоторыесправочные ссылки и шаг проверки.

-Duser.timezone=Pacific/Auckland также может работать, но когда я попробовал, это не сработало.

При настройке TZ вы должны убедиться, что вы установили его вподходящее место.Например, в контейнере промежуточного программного обеспечения WebLogic вы должны установить его в setDomainEnv.sh, так как WebLogic сначала очистит среду, а TZ не будет виден (мой пост показывает, как вы можете убедиться, что процесс JVM его видит.)

1 голос
/ 15 августа 2011

EDT & EST - это та же географическая зона. Но EST является стандартным временем и работает только зимой (а в некоторых местах даже летом), а EDT - это летнее время. Ваша проблема, вероятно, связана с переходами на летнее время, поэтому я бы покопался в этом направлении. Вы также можете указать конкретный часовой пояс (обычно в формате страны / города), установив часовой пояс по умолчанию, но в этом случае вы должны быть уверены, что не будет никаких конфликтов с текущим часовым поясом вашего сервера и тем, который вы указываете по умолчанию.

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