tl; dr
java.util.Date.from (
LocalDateTime.parse(
"Wed, 09 Feb 2011 12:34:27" ,
DateTimeFormatter.ofPattern( "EEE, dd MMM uuuu HH:mm:ss" , Locale.US )
).atZone( ZoneId.of( "America/Montreal" ) )
.toInstant()
)
Подробности
В Вопросе и других ответах используются устаревшие проблемные старые классы даты и времени, которые теперь унаследованы и заменены классами java.time.
Использование java.time
Во входной строке отсутствует указание часового пояса или смещения от UTC.Таким образом, мы анализируем как OffsetDateTime
.
Укажите Locale
, чтобы определить (а) человеческий язык для перевода названия дня, названия месяцаи тому подобное, и (б) культурным нормам, решающим вопросы аббревиатуры, заглавных букв, знаков препинания, разделителей и тому подобного.: 27
Часовой пояс
И в Вопросе, и в другом Ответе игнорируется важнейшая проблема часового пояса.
Во входной строке отсутствует часовой пояс или смещение.Мы проанализировали как LocalDateTime
, который не момент на временной шкале, только смутное представление о возможных моментах.Как сказать «Рождество начинается в полночь 25 декабря 2017 года», это не имеет смысла, пока вы не поместите его в контекст определенного часового пояса.Рождество в Окленде, Новая Зеландия, наступает намного раньше, чем в Париже, во Франции, и гораздо позже, в Монреале, Квебеке.
Если вы знаете предполагаемый часовой пояс, присвойте ZoneId
, чтобы получить ZonedDateTime
.
ZoneId z = ZoneId.of( "America/Montreal" ) ;
ZonedDateTime zdt = ldt.atZone( z ); // Assigning a time zone to determine an actual moment on the timeline.
Преобразование
Лучше, чтобы избежать неприятной старой устаревшей датывремя занятий.Но если вам нужно взаимодействовать со старым кодом, который еще не обновлен до типов java.time, вы можете выполнить преобразование между унаследованными классами и java.time.Посмотрите на новые методы, добавленные к старым классам.
A java.util.Date
- это момент времени на UTC.Поэтому нам нужно извлечь Instant
из нашего ZonedDateTime
.Класс Instant
представляет момент на временной шкале в UTC с разрешением наносекунд (до девяти (9) цифр десятичной дроби).
Instant instant = zdt.toInstant() ;
java.util.Date d = java.util.Date.from( instant ) ; // Convert from java.time to legacy class.
Идет в другом направлении.
Instant instant = d.toInstant() ; // Convert from legacy class to java.time class.
ZonedDateTime zdt = instant.atZone( z ) ; // Adjust from UTC into a particular time zone.
О java.time
java.time Framework встроен в Java 8 и более поздние версии.Эти классы вытесняют проблемные старые устаревшие классы даты и времени, такие как java.util.Date
, Calendar
и & SimpleDateFormat
.
Проект 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 .