2011-08-15 6 views
8

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

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

[[email protected] 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) 
[[email protected] bin]$ 

Дата система, скажем -

[[email protected] 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 с параметром неуместности. Проблемы, по-видимому, носят иной характер.

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

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

+0

Имейте ввиду, что если вы ищете только объект даты с текущим временем, вы можете вызывать новую дату() вместо использования Календаря. Вам все равно придется следовать совету Маурисио, установив часовой пояс по умолчанию. – jpredham

+0

Возможно, вы уже знаете, но EDT и EST - это тот же часовой пояс с/без DST. Август, как правило, EDT, поэтому _practically_ нет EST в августе в США. http://en.wikipedia.org/wiki/Eastern_Time_Zone – Nivas

+0

Да, я думаю, что проблема может быть связана с этим, поскольку, например, работает -Duser.timezone = AET. Однако я ищу постоянное решение этой проблемы, а не обходные пути. – Andrei

ответ

4

У меня была та же проблема. Получается, что я искал в файле /etc/sysconfig/clock файл /etc/localtime. Это для комментариев для more info

5

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

E.g. Список

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

+0

Привет и спасибо, что ответили. Хотя я знаю, что возможны некоторые обходные пути, я хотел бы исправить реальную проблему. Мой вопрос заключается в следующем: «как заставить JVM читать часовой пояс системы и использовать это по умолчанию» – Andrei

+0

Я понимаю, что вы имеете в виду; возможно, подумайте об этом обходном пути, который должен иметь тот же эффект, если вы не можете найти более окончательный ответ. Мне будет интересно узнать, есть ли ответ, я не знаю такой настройки в настоящее время. – Brian

3

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

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

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

+0

N.B. Помните, что этот метод останется в силе только на время жизни экземпляра JVM, например. не переживут перезагрузки Tomcat. – jpredham

+0

Да, поэтому вы должны добавить его в прослушиватель контекста сервлета или что-то в этом роде, убедившись, что он запускается всякий раз, когда загружается ваше приложение. –

+0

Привет и спасибо, что ответили. Хотя я знаю, что возможны некоторые обходные пути, я хотел бы исправить реальную проблему. Мой вопрос заключается в следующем: «как заставить JVM читать часовой пояс системы и использовать это по умолчанию» – Andrei

1

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

+0

Извините, я не думаю, что это имеет значение, в чем разница между ними.Все, что я хочу, это JVM, чтобы сообщать о том же времени/часовом поясе, что и часы системы. – Andrei

2

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

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

1

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

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

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

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

1

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

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

sudo timedatectl set-timezone America/New_York 
Смежные вопросы