Я понимаю, что вам нужен LocalDateTime
для API, который из-за не зависящей от вас проблемы проектирования пытается использовать LocalDateTime
для определенного момента времени.
Если внешний контракт диктует, в каком часовой пояс или в котором UT C смещение LocalDateTime
следует понимать, LocalDateTime
можно заставить работать, по крайней мере, для 99,977% случаев. У вас все еще будет ошибка программирования, ожидающая произойти в тот день, когда какой-то коллега-программист не прочитает контракт, проблема, которую мы не можем решить в коде, только попробуйте смягчить ее с помощью хороших комментариев.
Если, например, в контракте указано UT C, тогда нам нужно убедиться, что мы преобразовали время в UT C. И для этого нам нужно смещение от строки.
ZoneOffset contractualOffset = ZoneOffset.UTC;
String stringWeveGot = "Fri, 07 Aug 2020 18:00:00 +0000";
LocalDateTime convertedDateTime = OffsetDateTime
.parse(stringWeveGot, DateTimeFormatter.RFC_1123_DATE_TIME)
.withOffsetSameInstant(contractualOffset)
.toLocalDateTime();
System.out.println(convertedDateTime);
Вывод:
2020-08-07T18: 00
Если смещение в строке уже должно быть равно 0, вам необходимо подтвердить, что это так, иначе go ошибки будут незамеченными, и пользователи получат неверные результаты. Например:
OffsetDateTime parsedOdt = OffsetDateTime
.parse(stringWeveGot, DateTimeFormatter.RFC_1123_DATE_TIME);
if (! parsedOdt.getOffset().equals(contractualOffset)) {
throw new IllegalStateException("Offset must be " + contractualOffset
+ ", was " + parsedOdt.getOffset());
}
LocalDateTime convertedDateTime = parsedOdt.toLocalDateTime();
Если в контракте упоминается какой-то часовой пояс, конвертируйте в этот часовой пояс. В качестве примера я беру Австралию / Викторию.
ZoneId contractualZone = ZoneId.of("Australia/Victoria");
String stringWeveGot = "Fri, 07 Aug 2020 18:00:00 +0000";
LocalDateTime convertedDateTime = OffsetDateTime
.parse(stringWeveGot, DateTimeFormatter.RFC_1123_DATE_TIME)
.atZoneSameInstant(contractualZone)
.toLocalDateTime();
System.out.println(convertedDateTime);
2020-08-08T04: 00
Вы получите неоднозначный результат при временных аномалиях, когда часы повернут назад, например, при откате , когда закончится летнее время (DST).
Что пошло не так в вашем коде?
Объясняется причина вашего исключения здесь: