ТЛ; др
ZonedDateTime.parse( // Produce a `java.time.ZonedDateTime` object.
"Wed Jul 13 00:00:00 CEST 2011" , // Corrected `Tue` to `Wed`.
DateTimeFormatter.ofPattern( "EEE MMM d HH:mm:ss zzz uuuu" , Locale.US )
)
2011-07-13T00: 00 + 02: 00 [Европа / Париж]
Неверные данные: Wed
против Tue
Вы ввели строку Tue Jul 13 00:00:00 CEST 2011
неверно. 13 июля 2011 года была среда, , а не вторник .
String input = "Wed Jul 13 00:00:00 CEST 2011" ; // Corrected `Tue` to `Wed`.
java.time
Современный подход использует классы java.time, а не старые и устаревшие классы даты и времени, которые можно увидеть в других ответах.
Определите шаблон форматирования, соответствующий вашей входной строке. Обратите внимание на Locale
, который определяет человеческий язык, который будет использоваться при разборе названия месяца и названия дня недели.
DateTimeFormatter f = DateTimeFormatter.ofPattern( "EEE MMM d HH:mm:ss zzz uuuu" , Locale.US );
ZonedDateTime zdt = ZonedDateTime.parse( input , f );
zdt.toString (): 2011-07-13T00: 00 + 02: 00 [Европа / Париж]
Часовой пояс
Ваш CEST
является псевдозоной, а не истинным часовым поясом. Никогда не используйте это. Они не стандартизированы и даже не уникальны (!).
Класс ZonedDateTime
будет доблестно пытаться угадать намерение за такой псевдозоной из 3-4 символов. Ваш CEST
здесь работал, интерпретируется как Europe/Paris
часовой пояс. Но вы не можете полагаться на 100% -ное успешное предположение. Вместо этого избегают таких псевдозон полностью .
Укажите собственное имя часового пояса в формате continent/region
, например America/Montreal
, Africa/Casablanca
или Pacific/Auckland
.
ZoneId z = ZoneId.of( "Europe/Paris" ); // https://time.is/Paris
LocalDate today = LocalDate.now( z ); // Current date varies around the globe by zone.
ISO 8601
Формат вашей входной строки ужасный. При сериализации значений даты и времени в виде текста используйте только стандартные форматы ISO 8601 .
Класс ZonedDateTime
разумно расширяет стандартный формат, добавляя название часового пояса в квадратных скобках, как показано в примерах выше.
О java.time
Инфраструктура java.time встроена в Java 8 и более поздние версии. Эти классы вытесняют проблемные старые устаревшие классы даты и времени, такие как java.util.Date
, Calendar
, & SimpleDateFormat
.
Проект Joda-Time , в настоящее время находящийся в режиме обслуживания , рекомендует перейти на классы java.time .
Чтобы узнать больше, см. Oracle Tutorial . И поиск переполнения стека для многих примеров и объяснений. Спецификация JSR 310 .
Где получить классы java.time?
Проект ThreeTen-Extra расширяет java.time дополнительными классами. Этот проект является полигоном для возможных будущих дополнений к java.time. Здесь вы можете найти некоторые полезные классы, такие как Interval
, YearWeek
, YearQuarter
и more .