Как преобразовать строку даты в объект даты или календаря?

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


person Aaron    schedule 04.09.2008    source источник
comment
К вашему сведению, неприятные старые классы даты и времени, такие как java.util.Date , java.util.Calendar и java.text.SimpleTextFormat теперь являются устаревшими, вытесненными java.time. См. учебник Oracle.   -  person Basil Bourque    schedule 22.07.2017


Ответы (5)


Вкратце:

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

Дополнительную информацию см. в SimpleDateFormat javadoc.

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

Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
person Matt Sheppard    schedule 04.09.2008
comment
Что, если исходная строка может быть либо MM/dd/yy, либо yy/MM/dd? - person Cris; 26.10.2016
comment
Кристина, у меня тоже такая проблема. Я не знаю, какой формат отправляет сервер. Теперь, @Matt Sheppard, у вас есть предложения по этому поводу? - person AndroidGeek; 23.11.2016

tl;dr

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

Java.время

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

Старые объединенные классы, java.util.Date/.Calendar, печально известны своей сложностью и путаницей. Избежать их.

LocalDate

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

ИСО 8601

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

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

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

Форматтер

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

Шаблон форматирования

Дополнительные сведения см. в документации по классу DateTimeFormatter. на коды, используемые в шаблоне формата. Они немного отличаются от старых устаревших шаблонов класса 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 );

местная Дата: 02 января 2015 г.

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

Или вместо того, чтобы указывать шаблон форматирования, позвольте 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 г. | местная Дата: 02 января 2015 г.

person Basil Bourque    schedule 29.10.2015
comment
Отличный обзор! Этот ответ следует принять. - person Twonky; 12.04.2017

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

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

person serg10    schedule 04.09.2008
comment
Хотя Joda-Time была чрезвычайно успешной в качестве первой хорошей библиотеки даты и времени, команда Joda-Time теперь рекомендует перейти на java.time. - person Basil Bourque; 27.07.2016

Попробуй это:

DateFormat.parse(String)
person Apocalisp    schedule 04.09.2008

Класс DateFormat имеет метод parse.

Дополнительные сведения см. в разделе DateFormat.

person Alexander Stolz    schedule 04.09.2008