Дата парсить строку для некоторых Java-объект
Я работаю в проекте, который читает файлы и обрабатывает данные. Там я стал работать с датами, например:
- 2012-01-10 23:13:26
- 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