Я пытаюсь создать действительно строгую фабрику DateTimeFormatter
/ ZonedDateTime
. Если datetetime не имеет смысла как есть, тогда оно должно выдать исключение - никаких корректировок. Пример: если во время летнего времени пропущен час.
В настоящее время эти тесты не пройдены, исключение не выдается. ZonedDateTime угадывает / корректирует на основе правил, описанных в документации.
@Test
fun `Ambiguous hour during +0200 to +0100 DST change`() {
val input = "2019-10-27T02:30:00Europe/Prague"
val formatter = createFormatter()
Assertions.assertThrows(DateTimeParseException::class.java) {
ZonedDateTime.from(formatter.parse(input))
// Gets instead adjusted as 2019-10-27T02:30:00Europe/Prague+02:00
}
}
@Test
fun `Skipped hour during +0100 to +0200 DST change`() {
val formatter = createFormatter()
Assertions.assertThrows(DateTimeParseException::class.java) {
ZonedDateTime.from(formatter.parse("2019-03-31T02:30:00Europe/Prague"))
// Gets instead adjusted as 2019-03-31T03:30:00Europe/Prague+02:00
}
}
@Test
fun `Test impossible offset during DST change`() {
val input = "2019-10-27T02:30:00Europe/Prague+05:00"
val formatter = createFormatter()
Assertions.assertThrows(DateTimeParseException::class.java) {
ZonedDateTime.from(formatter.parse(input))
// Gets instead adjusted as 2019-10-26T23:30:00Europe/Prague+02:00
}
}
Изменения для области Europe/Prague
относятся к здесь .
Код, который я имею:
fun createFormatter(): DateTimeFormatter {
return DateTimeFormatterBuilder()
.parseCaseSensitive()
.parseStrict()
.append(DateTimeFormatter.ISO_LOCAL_DATE_TIME)
.appendZoneRegionId()
.optionalStart()
.appendOffsetId()
.optionalEnd()
.toFormatter()
.withResolverStyle(ResolverStyle.STRICT)
}
ZonedDateTime настраивается, как описано в документации. Я хотел бы изменить это поведение, чтобы бросать каждый раз, когда что-то не совсем понятно.