Вы не должны хотеть LocalDateTime
Например: две строки 2019-12-03T10:00:01+09:00
и 2019-12-03T10:00:01-08:00
обозначают точки во времени с интервалом в 17 часов, но будут разбиты на равные LocalDateTime
объекты. Я не думаю, что вы хотите этого.
Также LocalDateTime
, вероятно, не подходит для времени окончания заказа. Он не знает никакого часового пояса или смещения от UT C, поэтому каждый человек и каждый фрагмент кода, увидевший его, будут иметь возможность свободно интерпретировать часовой пояс, о котором они думают, а не предполагаемый. Это оставляет большой риск непредвиденных результатов. По крайней мере для 19 из 20 целей вам будет лучше использовать Instant
, OffsetDateTime
или ZonedDateTime
.
Разбор со смещением и без него: определите часовой пояс по умолчанию
Вы должны принять строки, которые идут без смещения. Затем вам также необходимо знать, какой часовой пояс использовать для таких строк - часовой пояс по умолчанию. Затем вы также можете их проанализировать.
Например:
ZoneId defaultTimeZone = ZoneId.of("America/Guatemala");
ZoneId resultTimeZone = ZoneId.of("Europe/Rome");
DateTimeFormatter formatter = new DateTimeFormatterBuilder()
.append(DateTimeFormatter.ISO_LOCAL_DATE_TIME)
.appendPattern("[XXX]")
.toFormatter();
for (String input : new String[] {
"2019-12-03T10:00:01+01:00",
"2019-12-03T10:00:00-06:00",
"2019-12-03T10:00:00"
}) {
TemporalAccessor parsed = formatter.parseBest(input,
OffsetDateTime::from, LocalDateTime::from);
ZonedDateTime dateTime;
if (parsed instanceof OffsetDateTime) {
dateTime = ((OffsetDateTime) parsed).atZoneSameInstant(resultTimeZone);
} else {
dateTime = ((LocalDateTime) parsed).atZone(defaultTimeZone)
.withZoneSameInstant(resultTimeZone);
}
System.out.format("%-25s is parsed into %s%n", input, dateTime);
}
Вывод этого фрагмента:
2019-12-03T10:00:01+01:00 is parsed into 2019-12-03T10:00:01+01:00[Europe/Rome]
2019-12-03T10:00:00-06:00 is parsed into 2019-12-03T17:00+01:00[Europe/Rome]
2019-12-03T10:00:00 is parsed into 2019-12-03T17:00+01:00[Europe/Rome]
Я использую [XXX]
в строке шаблона формата для обозначения необязательного смещения. Вызов parseBest()
анализируется в OffsetDateTime
, если это возможно (смещение присутствует), в противном случае в LocalDateTime
, который я впоследствии конвертирую. Наконец, я конвертирую все проанализированные даты и время в один часовой пояс, чтобы пользователь мог видеть согласованные результаты.