Дата парсить строку для некоторых Java-объект

Я работаю в проекте, который читает файлы и обрабатывает данные. Там я стал работать с датами, например:

  1. 2012-01-10 23:13:26
  2. 13 января 2012

Я нашел пакет Joda, интересный пакет, но не знаю, самый ли он простой.

я смог проанализировать первый пример для объекта DateTime (Joda) reg-ex и Строковой манипуляции. (Пример: заменив пробел на " - " и передав его конструктор.

new DateTime("2012-01-10 23:13:26".replace(' ', '-'))

Я думаю, это сработало, но проблема со вторым форматом. Как я могу использовать такой ввод для извлечения объекта, предпочтительно объекта Joda. Я уверен, что могу написать функцию, чтобы изменить формат на то, что поддерживает Joda, но было интересно, будет ли какой-то другой способ (даже некоторая родная библиотека Java) сделать это.

Если есть что-то лучше, чем Джода там, пожалуйста, дайте мне знать, а также.

спасибо.

6 ответов


используя Joda-Time, взгляните на DateTimeFormat; он позволяет анализировать оба типа строк даты, которые вы упоминаете (и почти любые другие произвольные форматы). Если ваши потребности еще более сложны, попробуйте DateTimeFormatterBuilder.

парсить #1:

DateTimeFormatter f = DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss");
DateTime dateTime = f.parseDateTime("2012-01-10 23:13:26");

Edit: на самом деле LocalDateTime является более подходящим типом для datetime без часового пояса:

LocalDateTime dateTime = f.parseLocalDateTime("2012-01-10 23:13:26");

и #2:

DateTimeFormatter f = DateTimeFormat.forPattern("MMMM dd, yyyy");
LocalDate localDate = f.parseLocalDate("January 13, 2012");

и да, Joda-Time-это определенно путь, насколько это касается обработки даты и времени Java. :)

как в основном все согласятся, Joda-исключительно удобная библиотека. Например, я никогда раньше не делал такого анализа с Джодой, но мне потребовалось всего несколько минут, чтобы понять это из API и написать его.

обновление (2015)

если вы Java 8 в большинстве случаев вы должны просто использовать java.time вместо Joda-время. Он содержит почти все хорошие вещи-или их эквиваленты-от Джоды. Для тех, кто уже знаком с Joda APIs, Stephen Colebourne Joda-время для java.руководство по миграции времени пригодится.

вот java.версии выше примеры.

парсить #1:

DateTimeFormatter f = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
LocalDateTime dateTime = LocalDateTime.from(f.parse("2012-01-10 23:13:26"));

вы не можете проанализировать это в ZonedDateTime или OffsetDateTime (которые являются аналогами DateTime Джоды, используемые в моем первоначальном ответе), но это имеет смысл, потому что в анализируемой строке нет информации о часовом поясе.

для разбора #2:

DateTimeFormatter f = DateTimeFormatter.ofPattern("MMMM dd, yyyy");
LocalDate localDate = LocalDate.from(f.parse("January 13, 2012"));

здесь LocalDate является наиболее подходящим типом для анализа (так же, как с Joda-Time).


SimpleDateFormat будет анализировать даты в объекты даты Java:

http://docs.oracle.com/javase/1.4.2/docs/api/java/text/SimpleDateFormat.html

SimpleDateFormat format1 = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss"); // first example
SimpleDateFormat format2 = new SimpleDateFormat("MMMMM dd,yyyy"); // second example

Date d1 = format1.parse( dateStr1 );
Date d2 = format2.parse( dateStr2 );

Я бы предположил, что у Джоды есть что-то вроде форматирования, чтобы сделать это для вас. Я нашел это с помощью быстрого поиска google: http://johannburkard.de/blog/programming/java/date-time-parsing-formatting-joda-time.html

DateTimeFormatter parser1 =
    DateTimeFormat.forPattern("dd/MMM/yyyy:HH:mm:ss Z");

DateTimeFormatter parser2 =
    DateTimeFormat.forPattern("yyyy-MM-dd HH:mm");

DateTime time = parser1.parseDateTime("<data>");

синтаксис, используемый для оценки шаблонов, можно найти в ссылка X-Zero.


JodaTime в значительной степени считается стандартом де-факто для обработки даты и времени в Java-они работают, чтобы добавить его в следующую версию библиотеки Java (ну, эффективно).

для получения дат JodaTime из строк вы захотите заглянуть в DateTimeFormat класса.


проще всего было бы правильно настроить SimpleDateFormat в соответствии с форматом, который вы ожидаете, и использовать его метод разбора, чтобы дать вам объект даты


tl; dr

LocalDateTime ldt = LocalDateTime.parse( "2012-01-10 23:13:26".replace( " " , "T" ) );

...и...

LocalDate localDate = LocalDate.parse ( "January 13, 2012" , DateTimeFormatter.ofLocalizedDate ( FormatStyle.LONG ).withLocale ( Locale.US ) );

подробности

на ответ от Jonik в основном правильно, но пропускает некоторые важные вопросы.

java.время

если есть что-то лучше, чем Джода там, пожалуйста, дайте мне знать, а также.

Да, есть кое-что получше,java.время основы. Команда Joda-Time советует перейти на java.время как его преемник.

на java.время framework встроен в Java 8 и более поздние версии. Эти классы вытесняют старые хлопотные классы даты-времени, такие как java.util.Date, .Calendar, & java.text.SimpleDateFormat.

чтобы узнать больше, см. В Oracle Учебник. И search Stack Overflow для многих примеров и объяснений.

большая часть java.функциональность времени обратно портирована на Java 6 & 7 в ThreeTen-Backport и далее адаптированы к Андроид в ThreeTenABP.

времени

ваш первый вход-это дата + время суток. Ему не хватает каких-либо смещение-от-UTC или часовой пояс info, поэтому мы анализируем его как LocalDateTime