У меня проблема, когда текущий часовой пояс не определен правильно в экземпляре JVM, запущенном внутри контейнера Docker (оба узла и контейнера - Cent OS 6.5).Как Hotspot JVM точно определяет текущий часовой пояс на Linux (Centos)?
Прежде всего я сопоставляются etc/localtime
к ребенку контейнера через -v /etc/localtime:/etc/localtime:ro
(я думаю, что это prevalent way)
Когда я Войти через SSH как на хост и контейнер
Дата -u
печатает Mon Apr 20 11:48:57 UTC 2015
и
Дата
печатает Mon Apr 20 14:50:41 MSK 2015
В JVM, однако с
System.out.println (новая дата());
Я получаю Mon Apr 20 11:52:24 UTC 2015
внутри контейнера и Mon Apr 20 14:53:17 MSK 2015
внутри хоста.
Как точно определяется текущий часовой пояс?
Oracle FAQ не пролил свет, я не совсем понимаю, что метрики Java делает использование Java, чтобы получить часовой пояс для текущего пользователя
Do моей операционной системы часовых поясов патчей исправить часового пояса данных на платформе Java-?
№ Данные часового пояса платформы Java SE не считываются из локальной или основной операционной системы. Платформа Java SE хранит частный репозиторий данных часового пояса в локально установленных файлах (.../jre/lib/zi) в составе программного обеспечения Java Runtime Environment (JRE) . Применение любых исправлений часовых поясов операционной системы (для примера Solaris OS, Linux, Windows) не повлияет на точность данных часового пояса платформы Java SE .
обновление: если кто-то заинтересованы в обходном пути - я указал переменные окружения TZ, как в ответе Стефана, так что теперь контейнер создается с параметрами
-v/и т.д./LocalTime:/и т.д./LocalTime: ро -e "TZ = Europe/Moscow"
Да - установка TZ работает, однако это тайна, почему время отличается, когда TZ не задан - я попытаюсь проверить TimeZone.setDefaultZone() в свободное время. –
Я предполагаю, что TZ установлен на хосте и не установлен в контейнере, а поведение JVM, если TZ не установлено, - это принять UTC. –