Java TimeZone.getTimeZone("PDT") не работает
Возвращает часовой пояс по умолчанию для GMT.
Используя SimpleTimeFormat с "z" для часового пояса, он печатает "PDT". Но "PDT" нет в списке, возвращаемом из TimeZone.getAvailableIDs(). Действительно странно!
Кто-нибудь знает, почему "PDT" не является стандартным TZ? Как с этим бороться? Кто-то вызывает мой API, передавая "PDT" как часовой пояс. Благодарю.
2 ответа
PDT
это не часовой пояс
Кто-нибудь знает, почему "PDT" не является стандартным TZ?
Потому что "PDT" не часовой пояс!
"PDT" - это псевдо-часовой пояс, используемый СМИ для расплывчатого указания набора часовых поясов плюс индикатор, если они предназначены для периода, когда используется летнее время (DST) или нет (PST
). Избегайте этих 3-4 буквенных кодов, поскольку они не являются истинными часовыми поясами, не стандартизированы и даже не являются уникальными (!).
Правильные названия часовых поясов
Укажите правильное название часового пояса в формате continent/region
, такие как America/Montreal
, Africa/Casablanca
, или же Pacific/Auckland
,
От PDT
Любой из этих и других часовых поясов может быть предназначен:
ZoneId z = ZoneId.of( "America/Los_Angeles" ) ;
ZoneId z = ZoneId.of( "America/Tijuana" ) ;
ZoneId z = ZoneId.of( "America/Whitehorse" ) ;
Но PDT
может не означать эту зону, поскольку Аризона не участвует в бессмысленном переходе на летнее время, и D
в середине означает DST.
ZoneId z = ZoneId.of( "America/Phoenix" ) ;
Избегайте устаревших классов даты и времени
избежать SimpleTimeFormat
Этот класс является частью проблемных старых классов даты и времени, которые теперь унаследованы и заменены классами java.time. использование DateTimeFormatter
вместо.
избежать TimeZone
также. Заменен на ZoneId
,
Проходить ZoneId
не строка
Кто-то вызывает мой API, передавая "PDT" как часовой пояс.
Измените свой API, чтобы взять ZoneId
в качестве аргумента, а не просто строка. Это гарантирует действительные значения и обеспечивает безопасность типов.
О java.time
Инфраструктура java.time встроена в Java 8 и более поздние версии. Эти классы вытесняют проблемные старые классы даты и времени, такие как java.util.Date
, Calendar
& SimpleDateFormat
,
Проект Joda-Time, находящийся сейчас в режиме обслуживания, рекомендует перейти на классы java.time.
Чтобы узнать больше, смотрите Oracle Tutorial. И поиск переполнения стека для многих примеров и объяснений. Спецификация JSR 310.
Где взять классы java.time?
- Java SE 8, Java SE 9 и более поздние
- Встроенный.
- Часть стандартного Java API со встроенной реализацией.
- Java 9 добавляет некоторые незначительные функции и исправления.
- Java SE 6 и Java SE 7
- Большая часть функциональности java.time перенесена на Java 6 и 7 в ThreeTen-Backport.
- Android
- Проект ThreeTenABP адаптирует ThreeTen-Backport (упомянутый выше) специально для Android.
- Смотрите Как использовать ThreeTenABP….
Проект ThreeTen-Extra расширяет java.time дополнительными классами. Этот проект является полигоном для возможных будущих дополнений к java.time. Вы можете найти некоторые полезные классы здесь, такие как Interval
, YearWeek
, YearQuarter
и многое другое.
"PDT" - это аббревиатура от "Pacific Daylight Time". Он используется в сочетании с тихоокеанским стандартным временем для создания часового пояса Тихого океана.
Идентификатор часового пояса для Тихоокеанского часового пояса: "America/Los_Angeles"
, Вы должны использовать это вместо этого.
Прочитайте вики-тег с часовым поясом и статью Википедии о базе данных tz.