Другие ответы были хорошими в 2011 году, когда они были написаны. Время движется. Сегодня никто не должен использовать давно устаревшие классы SimpleDateFormat
и Date
. Современный ответ использует классы java.time
:
String date = "14 aug 2011";
DateTimeFormatter parseFormatter = new DateTimeFormatterBuilder()
.parseCaseInsensitive()
.appendPattern("dd MMM uuuu")
.toFormatter(Locale.ENGLISH);
System.out.println(LocalDate.parse(date, parseFormatter)
.format(DateTimeFormatter.BASIC_ISO_DATE));
Это печатает желаемый:
20110814
Современный механизм синтаксического анализа несколько более строг, потому что опыт показывает, что старый был слишком снисходительным и часто приводил к неожиданным результатам в ситуациях, когда можно было ожидать сообщения об ошибке. Например, современный требует правильного регистра, то есть заглавная буква A в английском языке в августе, , если только мы не скажем, что он должен анализироваться без учета регистра. Вот что я делаю с parseCaseInsensitive()
. Этот вызов влияет на после вызовов методов построителя, поэтому мы должны поместить его до appendPattern()
.
Редактировать: Взяв вашу строку "14aug"
из вопроса буквально. SimpleDateFormat
использовал бы 1970 год по умолчанию (год эпохи), что затрудняло бы получение правильного года. Современные классы позволяют явно указывать год по умолчанию, например:
String date = "14aug";
DateTimeFormatter parseFormatter = new DateTimeFormatterBuilder()
.parseCaseInsensitive()
.appendPattern("ddMMM")
.parseDefaulting(ChronoField.YEAR, Year.now(ZoneId.systemDefault()).getValue())
.toFormatter(Locale.ENGLISH);
С этим изменением, запустив код сегодня, мы получим:
20170814
Редактировать 2: Теперь используйте DateTimeFormatter.BASIC_ISO_DATE
для форматирования, как рекомендовано в Ответ Василия Бурка .