tl; dr
Вместо этого используйте современные java.time классы.
Обведите все известные зоны, запросите набор правил для этой зоны, укажите момент и запросите необходимую информацию.
Instant instant = Instant.now() ;
for( ZoneId z : ZoneId.getAvailableZoneIds() )
{
String zoneName = z.getDisplayName( TextStyle.SHORT , Locale.US ) ;
ZoneRules rules = z.getRules() ;
ZoneOffset offset = rules.getOffset( instant ) ;
int secondsOfOffset = offset.getTotalSeconds() ;
boolean currentlyInDST = rules.isDaylightSavings( instant ) ;
Duration amountOfCurrentDstAdjustment = rules.getDaylightSavings( instant ) ;
…
}
sun.util.calender.ZoneInfo
- поддержка реализации TimeZone
(оба устарели)
Согласно этому классу JavaDoc , это просто конкретная реализация, поддерживающая класс TimeZone
для JVM, предоставленных Sun.
ZoneInfo - это подкласс реализации TimeZone, который представляет смещения по Гринвичу и переходы часового пояса на летнее время.
И TimeZone
, и ZoneInfo
устарели.Вместо этого вы должны использовать современные java.time классы.
При сборке Java Platform Module System Oracle начал постепенно сокращать доступ кчасти их реализации Java, которые устарели или никогда не предназначались для общественного потребления.Это непрерывный процесс.Любой ваш код, вызывающий классы из различных пакетов com.sun.*
, должен быть переписан для использования других классов.
java.time
TimeZone
- один из ужасных классов даты и времени, включенных в самые ранние версии Java.Теперь они унаследованы несколько лет назад современными java.time классами, определенными в JSR 310.
ZoneId
= часовой пояс
времязона теперь представлена классом ZoneId
, заменив TimeZone
.История прошлых, настоящих и будущих изменений в offset-from-UTC , используемых каждым регионом в зоне, отслеживается классом ZoneRules
.
tzdata
Имейте в виду, что политики во всем мире часто меняют часовые пояса.Это происходит чаще, чем вы думаете.Эти изменения отслеживаются файлом данных tzdata .Всякий раз, когда происходят изменения в зоне, которая вас волнует, вы должны обновлять этот список определения часовых поясов в ваших установках Java, вашей операционной системы, баз данных, таких как Postgres, и других библиотек, которые управляют своим собственным списком часовых поясов.
Правила зоны
Укажите правильное имя часового пояса в формате Continent/Region
, например America/Montreal
, Africa/Casablanca
или Pacific/Auckland
.Никогда не используйте 2-4 буквенные сокращения, такие как EST
или IST
, так как они не истинные часовые пояса, не стандартизированы и даже не уникальны (!).
ZoneId z = ZoneId.of( "America/Montreal" ) ;
Получить правила этой зоны.
ZoneRules rules = z.getRules() ;
Правила зоны для Instant
Instant
представляет момент в UTC, то есть момент с смещением от UTC , равным нулю часами, минутами и секундами.Указав момент, вы можете задавать вопросы о действующих правилах в то время.
Instant instant = Instant.now() ;
boolean currentlyInDST = rules.isDaylightSavings( instant ) ;
Duration amountOfCurrentDstAdjustment = rules.getDaylightSavings( instant ) ;
Циклические зоны
Вы можете повторно реализовать свой код, получив все часовые пояса, известныевнедрил tzdata , вызвав метод ZoneId.getAvailableZoneIds
.Вы можете зациклить возвращенный Set
.
Set< String > zones = ZoneId.getAvailableZoneIds() ;
for( String z : zones )
{
ZoneRules rules = ZoneId.of( z ).getRules() ;
…
}
Вы не объясняете свой код, например, что это означает:
DMessageFactory.getTimeZoneFromTimeZoneDifferential("110")
... поэтому я не могу сделать для вас больше.
Ваш код, похоже, ищет часовой пояс, который соответствует смещению от UTC (часы-минуты-секунды) и указан ли Летнее время (DST) или нет.Как обсуждалось выше, вы можете запросить ZoneRules
для этой информации.
О java.time
java.timeФреймворк встроен в Java 8 и более поздние версии.Эти классы вытесняют проблемные старые устаревшие классы даты и времени, такие как java.util.Date
, Calendar
, & SimpleDateFormat
.
Чтобы узнать больше, см. Oracle Tutorial .И поиск переполнения стека для многих примеров и объяснений.Спецификация JSR 310 .
Проект Joda-Time , теперь в режиме обслуживания , рекомендует выполнить переход на классы java.time .
Вы можете обмениваться java.time объектами напрямую с вашей базой данных. Используйте драйвер JDBC , совместимый с JDBC 4.2 или более поздней версией. Нет необходимости в строках, нет необходимости в java.sql.*
классах.
Где получить классы java.time?
Проект ThreeTen-Extra расширяет java.time дополнительными классами. Этот проект является полигоном для возможных будущих дополнений к java.time. Здесь вы можете найти несколько полезных классов, таких как Interval
, YearWeek
, YearQuarter
и more .