java.time
public static void parseCustomFormat(String formatPattern, String dateTimeString) {
LocalDate today = LocalDate.now(ZoneId.of("Asia/Kolkata"));
DateTimeFormatter formatter = new DateTimeFormatterBuilder()
.appendPattern(formatPattern)
.parseDefaulting(ChronoField.YEAR_OF_ERA, today.getYear())
.parseDefaulting(ChronoField.MONTH_OF_YEAR, today.getMonthValue())
.parseDefaulting(ChronoField.DAY_OF_MONTH, today.getDayOfMonth())
.toFormatter(Locale.ENGLISH);
LocalDateTime parsedDateTime = LocalDateTime.parse(dateTimeString, formatter);
System.out.format(Locale.ENGLISH, "%-19s -> %s%n", dateTimeString, parsedDateTime);
}
Приведенный выше метод будет в основном использовать день, месяц и / или год из строки, если шаблон говорит, что должен, и использовать соответствующие значения из сегодняшней даты, если нет.Например:
parseCustomFormat("HH:mm:ss", "08:05:05");
parseCustomFormat("yyyy-MM-dd'T'HH:mm:ss", "2015-11-23T21:41:45");
parseCustomFormat("MM H:mm", "10 20:58");
parseCustomFormat("yy d H:mm", "34 29 9:30");
Когда я запускал этот код сегодня, вывод был:
08:05:05 -> 2018-06-04T08:05:05
2015-11-23T21:41:45 -> 2015-11-23T21:41:45
10 20:58 -> 2018-10-04T20:58
34 29 9:30 -> 2034-06-29T09:30
Сбой синтаксического анализа может произойти, если шаблон содержит год недели и / или номер неделиu
для года или дня недели.Он обязательно потерпит неудачу, если он содержит часы в пределах AM или PM (строчные буквы h
, как в примере в вопросе) и не имеет маркера AM / PM.
У нас есть устаревший код, который мыприходится поддерживать из Java1.6 +
Никаких больших проблем.Я запустил приведенный выше код на Java 7 с обратным портом ThreeTen, обратным портом java.time
для Java 6 и 7 (см. Ссылку внизу), поэтому он должен работать и на Java 6.Если вам нужен java.util.Date
для вашего устаревшего кода (и вы не хотите обновлять его до java.time
только сейчас), преобразуйте его следующим образом:
Instant inst = parsedDateTime.atZone(ZoneId.systemDefault()).toInstant();
Date oldfashionedDate = DateTimeUtils.toDate(inst);
System.out.format(Locale.ENGLISH, "%-19s -> %s%n", dateTimeString, oldfashionedDate);
С этим изменением в вышеприведенном коде выводна моем компьютере было:
08:05:05 -> Mon Jun 04 08:05:05 CEST 2018
2015-11-23T21:41:45 -> Mon Nov 23 21:41:45 CET 2015
10 20:58 -> Thu Oct 04 20:58:00 CEST 2018
34 29 9:30 -> Thu Jun 29 09:30:00 CEST 2034
Ссылки