From df0306b6d67d34e9a87823950d352cdc1f5a1b82 Mon Sep 17 00:00:00 2001 From: Dmitry Khalanskiy Date: Mon, 4 Oct 2021 12:28:44 +0300 Subject: [PATCH 1/2] Work around a crash on older Android versions --- core/jvm/src/TimeZoneJvm.kt | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/core/jvm/src/TimeZoneJvm.kt b/core/jvm/src/TimeZoneJvm.kt index 5a5846382..63294fa9f 100644 --- a/core/jvm/src/TimeZoneJvm.kt +++ b/core/jvm/src/TimeZoneJvm.kt @@ -44,7 +44,7 @@ public actual open class TimeZone internal constructor(internal val zoneId: Zone internal fun ofZone(zoneId: ZoneId): TimeZone = when { zoneId is jtZoneOffset -> FixedOffsetTimeZone(UtcOffset(zoneId)) - zoneId.rules.isFixedOffset -> + zoneId.isFixedOffset -> FixedOffsetTimeZone(UtcOffset(zoneId.normalized() as jtZoneOffset), zoneId) else -> TimeZone(zoneId) @@ -54,6 +54,15 @@ public actual open class TimeZone internal constructor(internal val zoneId: Zone } } +// Workaround for https://github.com/Kotlin/kotlinx-datetime/issues/149 +private val ZoneId.isFixedOffset: Boolean + get() = try { + // On older Android versions, this can throw even though it shouldn't + rules.isFixedOffset + } catch (e: ArrayIndexOutOfBoundsException) { + false // Happens for America/Costa_Rica, Africa/Cairo, Egypt + } + @Serializable(with = FixedOffsetTimeZoneSerializer::class) public actual class FixedOffsetTimeZone internal constructor(public actual val offset: UtcOffset, zoneId: ZoneId): TimeZone(zoneId) { From 5b238fc963c6f02a04a584942ec5246e7ad4a6e2 Mon Sep 17 00:00:00 2001 From: Dmitry Khalanskiy Date: Mon, 25 Oct 2021 12:18:46 +0300 Subject: [PATCH 2/2] Reference the Android issue tracker --- core/jvm/src/TimeZoneJvm.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/jvm/src/TimeZoneJvm.kt b/core/jvm/src/TimeZoneJvm.kt index 63294fa9f..6ec4b9c8a 100644 --- a/core/jvm/src/TimeZoneJvm.kt +++ b/core/jvm/src/TimeZoneJvm.kt @@ -54,7 +54,7 @@ public actual open class TimeZone internal constructor(internal val zoneId: Zone } } -// Workaround for https://github.com/Kotlin/kotlinx-datetime/issues/149 +// Workaround for https://issuetracker.google.com/issues/203956057 private val ZoneId.isFixedOffset: Boolean get() = try { // On older Android versions, this can throw even though it shouldn't