Как разобрать две одинаковые строки для datetime в одном форматере с помощью joda? - PullRequest
0 голосов
/ 12 октября 2018

Теперь у меня есть два разных формата даты, записанные в строке:

String date1 = "2018-10-12 18:01:01";// yyyy-MM-dd HH:mm:ss
String date2 = "2018-10-12 18:01";//yyyy-MM-dd HH:mm

Я использую joda и хочу преобразовать строку в DateTime, основной способ - использовать два форматерадля разбора каждого из них:

DateTimeFormatter formatter1 = DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss");
DateTimeFormatter formatter2 = DateTimeFormat.forPattern("yyyy-MM-dd HH:mm");
DateTime dt1 = formatter1.parseDateTime(date1);
DateTime dt2 = formatter2.parseDateTime(date2);

Выше блоков кода работает нормально, но он создал два форматера, так как формат даты очень похож (последний просто не хватает секунд), мне интересно, если естьспособ, которым я могу использовать только один форматер для анализа всех их или мне нужно использовать два форматера?

Примечание: из-за ограничения производственной среды, я не могу использовать java8 сейчас, поэтому яхочу ответ на основе joda

Заранее спасибо!


Я только что попробовал, как показано ниже, и получил IllegalArgumentException: Invalid format

DateTimeFormatter formatter = DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss");
DateTime dt1 = formatter.parseDateTime(date1);
DateTime dt2 = formatter.parseDateTime(date2);

Ответы [ 3 ]

0 голосов
/ 12 октября 2018

Вы можете указать, что некоторые части формата необязательны, используя []

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm[:ss]");
LocalDateTime dateTime = LocalDateTime.parse("2018-10-12 18:01:01", formatter);
LocalDateTime dateTime1 = LocalDateTime.parse("2018-10-12 18:01", formatter);
System.out.println(dateTime + " " + dateTime1);

Результат равен

2018-10-12T18:01:01 2018-10-12T18:01

См. Шаблоны для форматирования и синтаксического анализа раздел для дополнительной информации.

0 голосов
/ 13 октября 2018

Два варианта:

  1. Используйте java.time, современный Java-интерфейс даты и времени через библиотеку ThreeTen Backport.
  2. Используйте Joda-Time, как вы уже это делаете.

ThreeTen Backport

Две цитаты с домашней страницы Joda-Time:

Теперь пользователям предлагается перейти на java.time (JSR-310).

Обратите внимание, что Joda-Time считается в значительной степени «законченным» проектом.Никаких серьезных улучшений не планируется.При использовании Java SE 8 перейдите на java.time (JSR-310).

Хорошая новость заключается в том, что вы можете мигрировать даже при использовании Java 6 или 7. Разработчики java.time (leadСтивен Колебурн, также ведущий разработчик Joda-Time) также разработал ThreeTen Backport, бэкпорт java.time для Java 6 и 7. См. ссылку внизу.

Антон Баланюк уже показываеткод в его хорошем ответе, поэтому я не буду повторять это здесь.

Joda-Time

    String date1 = "2018-10-12 18:01:01";// yyyy-MM-dd HH:mm:ss
    String date2 = "2018-10-12 18:01";//yyyy-MM-dd HH:mm
    DateTimeFormatter parser = new DateTimeFormatterBuilder()
                    .appendPattern("yyyy-MM-dd HH:mm")
                    .appendOptional(DateTimeFormat.forPattern(":ss").getParser())
                    .toFormatter();
    DateTime dt1 = parser.parseDateTime(date1);
    DateTime dt2 = parser.parseDateTime(date2);
    System.out.println("dt1: " + dt1);
    System.out.println("dt2: " + dt2);

На моем компьютере в часовом поясе Европы / Копенгагена вывод этого фрагментабыло:

dt1: 2018-10-12T18:01:01.000+02:00
dt2: 2018-10-12T18:01:00.000+02:00

Как видите, ключом к указанию необязательных деталей в формате является appendOptional метод DateTimeFormatterBuilder.

Ссылки

0 голосов
/ 12 октября 2018

Вы можете использовать DateTimeFormatterBuilder класс, что-то вроде этого.

  private DateTimeFormatter formatterBuilder() {
        return new DateTimeFormatterBuilder()
                .appendPattern("yyyy-MM-dd HH:mm")
                .optionalStart().appendPattern(":ss").optionalEnd()
                .toFormatter();
    }
...