У меня есть представление String
даты, с которой мне нужно создать объект Date
или Calendar
. Я просмотрел API-интерфейсы Date
и Calendar
, но не нашел ничего, что могло бы сделать это, кроме создания моего собственного уродливого метода синтаксического анализа. Я знаю, что должен быть способ, знает ли кто-нибудь о решении?
Как преобразовать дату String в объект 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)
Ответ 5
Класс DateFormat
имеет метод parse
.
Подробнее см. http://java.sun.com/j2se/1.4.2/docs/api/java/text/DateFormat.html.