Как преобразовать дату String в объект Date или Calendar?

У меня есть представление String даты, с которой мне нужно создать объект Date или Calendar. Я просмотрел API-интерфейсы Date и Calendar, но не нашел ничего, что могло бы сделать это, кроме создания моего собственного уродливого метода синтаксического анализа. Я знаю, что должен быть способ, знает ли кто-нибудь о решении?

Ответ 1

Вкратце:

DateFormat formatter = new SimpleDateFormat("MM/dd/yy");
try {
  Date date = formatter.parse("01/29/02");
} catch (ParseException e) {
  e.printStackTrace();
}

Подробнее см. SimpleDateFormat javadoc.

И чтобы превратить его в Calendar, do:

Calendar calendar = Calendar.getInstance();
calendar.setTime(date);

Ответ 2

TL;DR

LocalDate.parse( "2015-01-02" )

java.time

Java 8 и более поздние версии имеют новую структуру java.time, которая делает эти другие ответы устаревшими. Эта структура основана на Joda-Time, определяемом JSR 310, и расширен с помощью проекта ThreeTen-Extra. См. Tutorial.

Старые связанные классы, java.util.Date/.Calendar, как известно, являются неприятными и запутанными. Избегайте их.

LocalDate

Как и Joda-Time, у java.time есть класс LocalDate, чтобы представлять значение только для даты без времени суток и без часового пояса.

ISO 8601

Если ваша строка ввода находится в стандартном ISO 8601 формате yyyy-MM-dd, вы можете попросить, чтобы класс напрямую анализировал строку без необходимо указать форматтер.

Форматы ISO 8601 используются по умолчанию в java.time для анализа и генерации строковых представлений значений даты и времени.

LocalDate localDate = LocalDate.parse( "2015-01-02" );

Formatter

Если у вас другой формат, укажите форматтер из пакета java.time.format. Вы можете указать свой собственный шаблон форматирования или позволить java.time автоматически локализовать в соответствии с Locale, определяющим человеческий язык для перевода и культурные нормы для решения таких вопросов, как период против запятой.

Форматирование

Прочтите DateTimeFormatter класс doc для получения подробной информации о кодах, используемых в шаблоне формата. Они немного отличаются от старых устаревших шаблонов классов java.text.SimpleDateFormat.

Обратите внимание, как второй аргумент метода parse представляет собой ссылку , синтаксис, добавленный в Java 8 и более поздние версии.

String input = "January 2, 2015";
DateTimeFormatter formatter = DateTimeFormatter.ofPattern ( "MMMM d, yyyy" , Locale.US );
LocalDate localDate = LocalDate.parse ( input , formatter );

Дамп для консоли.

System.out.println ( "localDate: " + localDate );

localDate: 2015-01-02

Локализация автоматически

Или вместо того, чтобы указывать шаблон форматирования, пусть java.time локализуется для вас. Вызовите DateTimeFormatter.ofLocalizedDate и не забудьте указать желаемый/ожидаемый Locale, а не полагаться на текущее значение по умолчанию JVM, которое может измениться в любой момент во время выполнения (!).

String input = "January 2, 2015";
DateTimeFormatter formatter = DateTimeFormatter.ofLocalizedDate ( FormatStyle.LONG );
formatter = formatter.withLocale ( Locale.US );
LocalDate localDate = LocalDate.parse ( input , formatter );

Дамп для консоли.

System.out.println ( "input: " + input + " | localDate: " + localDate );

ввод: 2 января 2015 г. | localDate: 2015-01-02

Ответ 3

Рассматривается высоко оцененная библиотека времени Joda. Это основа для новой даты и времени api, которая предназначена для Java 7. Дизайн является опрятным, интуитивно понятным, хорошо документирован и избегает много неуклюжести исходных классов java.util.Date/java.util.Calendar.

Joda DateFormatter может анализировать строку в Joda DateTime.

Ответ 4

Попробуйте следующее:

DateFormat.parse(String)