tl; dr
LocalDateTime.parse(dateTimeString, DateTimeFormatter.ofPattern("M/d/yyyy h:m:s a");
достаточно для всех ваших примеров datetime.
В следующем примере можно проанализировать все ваши примеры datetime String
s с использованием LocalDateTime.parse
вместо DateTimeFormatter.parse
, которые отличаются:
public static void main(String[] args) {
String first = "12/21/2020 12:12:12 PM";
String second = "1/12/2020 2:6:8 PM";
String third = "10/2/2020 10:50:8 AM";
DateTimeFormatter dtf = DateTimeFormatter
.ofPattern("[MM/dd/yyyy HH:mm:ss a][M/dd/yyyy h:m:s a][MM/d/yyyy HH:mm:s a]");
System.out.println(LocalDateTime.parse(first, dtf));
System.out.println(LocalDateTime.parse(second, dtf));
System.out.println(LocalDateTime.parse(third, dtf));
}
Посмотрите на второй / средний шаблон, он использует h
(нижний регистр) для часов вместо H
(верхний регистр), потому что AM / PM дня будет также получен из заглавной буквы H
, что приведет к конфликту во второй выборке даты и времени "1/12/2020 2:6:8 PM"
, где 02:06:08 считается AM , но за ним следует PM в шаблоне.
Вывод моего решения таков:
2020-12-21T12:12:12
2020-01-12T14:06:08
2020-10-02T10:50:08
, который правильно анализирует время до PM (14 = 02 PM).
Примечание:
Не используйте это DateTimeFormatter
для вывода LocalDateTime.format(DateTimeFormatter)
, потому что оно вернет все три определенных форматирования ...
Очень некрасиво: 10/02/2020 10:50:08 AM10/02/2020 10:50:8 AM10/2/2020 10:50:8 AM