0

为什么这段代码在 intellij 中运行良好,但在 Android Studio 中运行时抛出异常?

fun main() {
    val date = "Wed Mar 31 17:27:07 ICT 2021"
    println(date.toEpochSecond())
}

fun String.toEpochSecond(): Long {
    val dbResponsePattern = "EEE MMM dd HH:mm:ss z yyyy"
    val dateTimeFormatter = DateTimeFormatter.ofPattern(dbResponsePattern)
    return ZonedDateTime.parse(this, dateTimeFormatter).toInstant().epochSecond
}

还有这个

fun main() {
    val date = "Wed Mar 31 17:27:07 ICT 2021"
    println(date.toEpochSecond())
}

fun String.toEpochSecond(): Long {
    val dbResponsePattern = "EEE MMM dd HH:mm:ss z yyyy"
    val dateTimeFormatter = DateTimeFormatter.ofPattern(dbResponsePattern)
    return Date.from(
            LocalDateTime.parse(this, dateTimeFormatter)
                    .atZone(ZoneId.systemDefault())
                    .toInstant()
    ).toInstant().epochSecond
}

发生异常时,文本与我在这里使用的文本完全相同。

例外:

E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.wo1f.the_earth, PID: 16409
    java.time.format.DateTimeParseException: Text 'Wed Mar 31 17:27:07 ICT 2021' could not be parsed at index 20
        at java.time.format.DateTimeFormatter.parseResolved0(DateTimeFormatter.java:1949)
        at java.time.format.DateTimeFormatter.parse(DateTimeFormatter.java:1851)
        at java.time.LocalDateTime.parse(LocalDateTime.java:486)
        at com.wo1f.base_android.DateMapperKt.toEpochSecond(DateMapper.kt:17)
        at com.wo1f.domain.usecases.SyncProfile.syncPost(SyncProfile.kt:46)
        at com.wo1f.domain.usecases.SyncProfile.access$syncPost(SyncProfile.kt:15)
        at com.wo1f.domain.usecases.SyncProfile$invoke$2$1$invokeSuspend$$inlined$collect$1.emit(Collect.kt:144)
        at com.wo1f.domain.usecases.SyncProfile$invoke$2$1$invokeSuspend$$inlined$collect$1$1.invokeSuspend(Unknown Source:15)
        at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33)
        at kotlinx.coroutines.DispatchedTask.run(DispatchedTask.kt:106)
        at android.os.Handler.handleCallback(Handler.java:938)
        at android.os.Handler.dispatchMessage(Handler.java:99)
        at android.os.Looper.loop(Looper.java:223)
        at android.app.ActivityThread.main(ActivityThread.java:7656)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:592)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:947)
4

1 回答 1

0

如果您使用不同版本的时区数据库,可能会导致此问题。默认情况下,java 从java 安装附带的IANA 时区数据库中获取时区信息。此数据库可能会发生变化,并且两个不同的 JRE 可能正在使用此数据库的两个不同版本。您可以验证正在使用的数据库版本

java -jar tzupdater.jar -V

似乎 intellij 使用的 JRE 使用的是过时的 IANA 时区数据库,其中包括 ICT 区域,这必须是 2017 年之前的版本,因为 ICT 和其他发明的时区在2017 年版本中被删除

过去和未来时区缩写的更改

作为正在进行的删除发明缩写项目的一部分,切换到南美洲的数字时区缩写。这避免了为新的智利新区发明缩写的需要。同样,将阿富汗、美属萨摩亚、亚速尔群岛、孟加拉国、不丹、英属印度洋领地、文莱、佛得角、查塔姆群岛、圣诞节 I、科科斯(基林)群岛、库克群岛、迪拜从发明的时区缩写转换为数字时区缩写, 东帝汶, Eucla, 斐济, 法属波利尼西亚, 格陵兰, 印度支那

要获取当前可用的 zoneIds,您可以查询 jvm 为

java.util.TimeZone.getAvailableIDs()
// or
ZoneId.getAvailableZoneIds()
于 2021-08-13T04:13:05.893 回答