From 11c515760723d6fd797477b51ebcd9f61f4bad65 Mon Sep 17 00:00:00 2001 From: Dmitry Khalanskiy <52952525+dkhalanskyjb@users.noreply.github.com> Date: Mon, 22 Jul 2024 12:45:16 +0200 Subject: [PATCH] Fix the time overlap right boundary being included in the overlap (#404) Fixes #403 Fixes #399 --- core/common/test/TimeZoneTest.kt | 1 + core/native/src/internal/TimeZoneRules.kt | 2 +- core/tzfile/test/TimeZoneRulesTest.kt | 7 +++++-- 3 files changed, 7 insertions(+), 3 deletions(-) diff --git a/core/common/test/TimeZoneTest.kt b/core/common/test/TimeZoneTest.kt index 97d4e3269..f59bd2cec 100644 --- a/core/common/test/TimeZoneTest.kt +++ b/core/common/test/TimeZoneTest.kt @@ -281,6 +281,7 @@ private fun checkOverlap(timeZone: TimeZone, overlapStart: LocalDateTime) { val instantStart = overlapStart.plusNominalSeconds(-1).toInstant(timeZone).plus(1, DateTimeUnit.SECOND) // the later occurrence of the overlap val instantEnd = overlapStart.plusNominalSeconds(1).toInstant(timeZone).minus(1, DateTimeUnit.SECOND) + assertEquals(instantEnd, overlapStart.toInstant(timeZone)) try { // there is at least a one-second overlap assertNotEquals(instantStart, instantEnd) diff --git a/core/native/src/internal/TimeZoneRules.kt b/core/native/src/internal/TimeZoneRules.kt index 4eae909ce..61ac4a06d 100644 --- a/core/native/src/internal/TimeZoneRules.kt +++ b/core/native/src/internal/TimeZoneRules.kt @@ -167,7 +167,7 @@ internal class RecurringZoneRules( val ldtAfter = rule.transitionDateTime.toLocalDateTime(rule.offsetAfter) return if (localDateTime < ldtBefore && localDateTime < ldtAfter) { OffsetInfo.Regular(rule.offsetBefore) - } else if (localDateTime > ldtBefore && localDateTime >= ldtAfter) { + } else if (localDateTime >= ldtBefore && localDateTime >= ldtAfter) { offset = rule.offsetAfter continue } else if (ldtAfter < ldtBefore) { diff --git a/core/tzfile/test/TimeZoneRulesTest.kt b/core/tzfile/test/TimeZoneRulesTest.kt index 36850bf16..c4666a62b 100644 --- a/core/tzfile/test/TimeZoneRulesTest.kt +++ b/core/tzfile/test/TimeZoneRulesTest.kt @@ -22,10 +22,13 @@ class TimeZoneRulesTest { // on the last Sunday in October. val dstStartTime = LocalDateTime(2040, 3, 25, 2, 0) val infoAtDstStart = rules.infoAtDatetime(dstStartTime) - assertTrue(infoAtDstStart is OffsetInfo.Gap, "Expected Gap, got $infoAtDstStart") + assertIs(infoAtDstStart) val dstEndTime = LocalDateTime(2040, 10, 28, 3, 0) val infoAtDstEnd = rules.infoAtDatetime(dstEndTime) - assertTrue(infoAtDstEnd is OffsetInfo.Overlap, "Expected Overlap, got $infoAtDstEnd") + assertIs(infoAtDstEnd) + val timeBeforeDstEnd = LocalDateTime(2040, 10, 28, 2, 59, 59, 999_999_999) + val infoBeforeDstEnd = rules.infoAtDatetime(timeBeforeDstEnd) + assertIs(infoBeforeDstEnd) } @Test