Это немного сложно. Как говорит jvdmr , количество X имеет значение.XXXXX
распознает -08:30:15
, но не -083015
.XXXX
распознает последний, но не первый.
Чтобы принять во внимание все возможные примеры форматов, нам нужно указать различные возможности.Это можно сделать в строке шаблона формата с использованием квадратных скобок.Они включают дополнительные части.Небольшой эксперимент показал, что следующий шаблон охватывает все примеры:
uuuu-MM-dd'T'HH:mm:ss[XXXXX][XXXX][X]
Давайте попробуем:
DateTimeFormatter formatter
= DateTimeFormatter.ofPattern("uuuu-MM-dd'T'HH:mm:ss[XXXXX][XXXX][X]");
for (String dts : new String[] {
"2014-01-01T00:30:00-08:30:15", "2014-01-01T00:30:00-083015",
"2014-01-01T00:30:00-08:30", "2014-01-01T00:30:00-0830",
"2014-01-01T00:30:00-08", "2014-01-01T00:30:00Z",
}) {
System.out.println(OffsetDateTime.parse(dts, formatter));
}
Вывод из этогоФрагмент:
2014-01-01T00:30-08:30:15
2014-01-01T00:30-08:30:15
2014-01-01T00:30-08:30
2014-01-01T00:30-08:30
2014-01-01T00:30-08:00
2014-01-01T00:30Z
Редактировать
VelNaga предлагает не жестко кодировать форматы даты и времени ISO.Поскольку написание строк шаблона формата подвержено ошибкам, это может быть хорошей идеей.Например:
DateTimeFormatter formatter = new DateTimeFormatterBuilder()
.append(DateTimeFormatter.ISO_LOCAL_DATE_TIME)
.appendPattern("[XXXXX][XXXX][X]")
.toFormatter();
Вывод с использованием этого форматера такой же, как с использованием приведенного выше.Это словесно, но мы могли бы легко подумать, что оно того стоит, поскольку оно менее подвержено ошибкам и может быть более ясным и легким для чтения.