Формат даты Java

Имейте строку str "23 мая 2011 12:20:00", хотите преобразовать ее в дату, например:

Date date = (new SimpleDateFormat("MMM dd yyyy HH:mm:ss")).parse(str);

Это всегда дает мне формат даты ParseException Unparsable: «23 мая 2011 г., 12:20:00».

Искал похожие проблемы, вроде все правильно.

Что случилось?


person Rinat Tainov    schedule 26.05.2011    source источник
comment
У меня отлично работает: System.out.println((new SimpleDateFormat("MMM dd yyyy HH:mm:ss")).parse("May 23 2011 12:20:00")); печатает Mon May 23 12:20:00 IST 2011   -  person Harry Joy    schedule 26.05.2011
comment
Возможно, у вас старая версия Java. Какую версию вы используете?   -  person Peter Lawrey    schedule 26.05.2011
comment
Java версии 1.6.0 обновление 21, может импорт неправильный? это из импорта java.text.SimpleDateFormat и java.text.ParseException? дата из java.util   -  person Rinat Tainov    schedule 26.05.2011


Ответы (5)


Вам может потребоваться дополнительно указать Язык, если Локаль по умолчанию для вашей ВМ не английский:

Date date = (new SimpleDateFormat("MMM dd yyyy HH:mm:ss", Locale.US)).parse(str);
person Andreas Krueger    schedule 26.05.2011

У меня работает!

person jmj    schedule 26.05.2011
comment
какую версию java вы используете? - person jmj; 26.05.2011

Попробуйте указать локаль при создании объекта SimpleDateFormat.

person bigoldbrute    schedule 26.05.2011

tl;dr

LocalDateTime.parse(
    "May 23 2011 12:20:00" , 
    DateTimeFormatter.ofPattern( "MMM d uuuu HH:mm:ss" , Locale.US )
)

Использование java.time

Правильный принятый ответ Андреаса Крюгера. Вы должны указать Locale, чтобы определить человеческий язык, используемый при переводе названия месяца. Лучше всего взять за привычку всегда указывать локаль при работе с датой и временем.

Современный подход избегает неприятных старых классов даты и времени, вместо этого используя их замены, классы java.time.

String input = "May 23 2011 12:20:00" ;

Определите шаблон форматирования для соответствия вводу с помощью DateTimeFormatter класс.

Locale определяет (а) язык для перевода названия дня, названия месяца и т. д. и (б) культурные нормы, решающие вопросы аббревиатуры, использования заглавных букв, пунктуации, разделителей и т. д.

Locale locale = Locale.US ;
DateTimeFormatter f = DateTimeFormatter.ofPattern( "MMM d uuuu HH:mm:ss" , locale );

В вашем вводе отсутствуют какие-либо указания на часовой пояс или смещение от UTC. Итак, мы анализируем как LocalDateTime.

LocalDateTime ldt = LocalDateTime.parse( input , f ) ;

ldt.toString(): 2011-05-23T12:20:00


О java.time

Платформа java.time встроен в Java 8 и более поздние версии. Эти классы заменяют проблемные старые устаревшие классы даты и времени, такие как java.util.Date, Calendar и SimpleDateFormat.

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

Чтобы узнать больше, см. учебник по Oracle. И поищите множество примеров и пояснений в Stack Overflow. Спецификация: JSR 310.

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

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

person Basil Bourque    schedule 11.05.2017

Вероятно, это проблема с инструментом, который вы используете. Взгляни на:

Почему я получаю исключение ParseException при использовании SimpleDateFormat для форматирования даты и последующего ее анализа?

person Oleg    schedule 26.05.2011