ТЛ; др
Java-программист никогда не должен полагаться на текущий часовой пояс JVM по умолчанию.
- Всегда указывайте правильное имя часового пояса в формате
Continent/Region
, например Africa/Casablanca
.
- Всегда подтверждайте желаемую / ожидаемую зону с пользователем, когда это важно.
Правильные названия часовых поясов
Укажите собственное имя часового пояса в формате continent/region
, например America/Montreal
, Africa/Casablanca
или Pacific/Auckland
. Никогда не используйте 2-4 буквенные сокращения, такие как CST
, EST
или IST
, поскольку они не истинных часовых поясов, не стандартизированы и даже не уникальны (!). Например, если вы используете IST
для стандартного времени Ирландии, вы можете вместо этого получить стандартное время Индии с удивительными результатами.
ZoneId z = ZoneId.of( "America/Montreal" ) ; // Or "Pacific/Auckland", "Africa/Tunis", etc.
Укажите часовой пояс
Никогда не полагайтесь на текущий часовой пояс JVM по умолчанию. Это значение по умолчанию может измениться.
- Как объясняют другие Ответы, большинство JVM по умолчанию используют часовой пояс по умолчанию, используемый хост-операционной системой при запуске JVM.
- Или скрипт, запускающий JVM, может пройти флаг, чтобы указать часовой пояс по умолчанию при запуске.
- и во время выполнения (!) текущий часовой пояс JVM по умолчанию может быть установлен любым кодом в любом потоке любого приложения в JVM, вызывающем
TimeZone.setDefault
. (Кстати, TimeZone
устарел на ZoneId
& ZoneOffset
, за исключением того метода установки, который никогда не должен вызываться, кроме как в самой экстремальной ситуации.)
- И, конечно, пользователь или системный администратор может изменить свой текущий часовой пояс по умолчанию на хост-ОС, который, насколько я знаю, не обнаруживается при запуске JVM в большинстве реализаций.
Таким образом, по всем этим причинам текущий часовой пояс JVM по умолчанию полностью находится в руках программиста и, что еще хуже, может динамически меняться во время выполнения. Поэтому использование текущего значения по умолчанию ненадежно.
Используйте текущий часовой пояс JVM по умолчанию только для самых случайных целей. Для всего, что имеет значение, вы просто должны подтвердить предполагаемую зону с пользователем . Это неудобная истина, которой часто сопротивляются программисты, но, тем не менее, это правда.
Locale
Подсказка: то же самое для Locale
. Текущий язык по умолчанию JVM может совпадать или не совпадать с языком операционной системы хоста, может измениться в любой момент и поэтому ненадежен. Всегда подтверждайте желаемое / ожидаемое Locale
с пользователем.
О java.time
Фреймворк java.time встроен в Java 8 и более поздние версии. Эти классы заменяют проблемные старые устаревшие классы даты и времени, такие как java.util.Date
, Calendar
, SimpleDateFormat
и java.util.TimeZone
.
Проект Joda-Time , теперь в режиме обслуживания , рекомендует перейти на классы java.time .
Чтобы узнать больше, см. Oracle Tutorial . И поиск переполнения стека для многих примеров и объяснений. Спецификация JSR 310 .
Вы можете обмениваться java.time объектами напрямую с вашей базой данных. Используйте драйвер JDBC , совместимый с JDBC 4.2 или более поздней версии. Нет необходимости в строках, нет необходимости в java.sql.*
классах.
Где получить классы java.time?
Проект ThreeTen-Extra расширяет java.time дополнительными классами. Этот проект является полигоном для возможных будущих дополнений к java.time. Здесь вы можете найти некоторые полезные классы, такие как Interval
, YearWeek
, YearQuarter
и more .