Java - уникальная дата

Я пытаюсь разобрать дату, но я странно получаю исключение.

Это код:

import java.util.Date;

String strDate = "Wed, 09 Feb 2011 12:34:27";
Date date;
SimpleDateFormat FORMATTER =  new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss");
try {
  date = FORMATTER.parse(strDate.trim());
  System.out.println(date);
} catch (ParseException e) {
  e.printStackTrace();
}

Исключение составляет:

java.text.ParseException: неотступно дата: "ср, 09 фев. 2011 12:34:27" at java.text.DateFormat.parse(DateFormat.java:337)   на DateTest.main(DateTest.java:17)

Я прочитал документацию , и я думаю, что мой шаблон верен. Поэтому я не понимаю...

Любая идея?

Спасибо!

Ответы

Ответ 1

Возможно, это из-за языкового стандарта по умолчанию на вашем компьютере, который не является английским.

Вы должны использовать:

new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss", Locale.ENGLISH);

вместо.

Ответ 2

ТЛ; др

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 чтобы определить (а) человеческий язык для перевода имени дня, названия месяца и т.д. И (б) культурных норм, определяющих вопросы сокращения, капитализации, пунктуации, разделителей и т.д.

String input = "Wed, 09 Feb 2011 12:34:27" ;
Locale l = Locale.US ; 
DateTimeFormatter f = DateTimeFormatter.ofPattern( "EEE, dd MMM uuuu HH:mm:ss" , l ) ;
LocalDateTime ldt = LocalDateTime.parse( input , f ) ;

ldt.toString(): 2011-02-09T12: 34: 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. Посмотрите, как новые методы добавляют к старым классам.

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 встроена в Java 8 и более поздние версии. Эти классы вытесняют неприятные старые устаревшие классы времени, такие как java.util.Date, Calendar и SimpleDateFormat.

Проект Joda-Time, теперь в режиме обслуживания, советует перейти на классы java.time.

Чтобы узнать больше, ознакомьтесь с учебным пособием Oracle. И поиск Qaru для многих примеров и объяснений. Спецификация - JSR 310.

Вы можете обменивать объекты java.time непосредственно с вашей базой данных. Используйте JDBC-драйвер, совместимый с JDBC 4.2 или новее. Нет необходимости в строках, нет необходимости в java.sql.*.

Где можно получить классы java.time?

  • Java SE 8, Java SE 9, Java SE 10 и более поздние версии
    • Встроенный.
    • Часть стандартного Java API с интегрированной реализацией.
    • Java 9 добавляет некоторые незначительные функции и исправления.
  • Java SE 6 и Java SE 7
    • Большая часть функциональных возможностей java.time включена обратно в Java 6 и 7 в ThreeTen-Backport.
  • Android

Проект ThreeTen-Extra расширяет java.time с дополнительными классами. Этот проект является доказательством возможных будущих дополнений к java.time. Здесь вы можете найти полезные классы, такие как Interval, YearWeek, YearQuarter и другие.