DateTimeParseException не удалось проанализировать в индексе 20

Почему этот код отлично работал в intellij, но вызывал исключение при работе в студии Android?

      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)

1 ответ

Это может быть вызвано использованием другой версии базы данных часовых поясов. По умолчанию java получает информацию о часовом поясе из базы данных IANA Timezone , которая поставляется с установкой java. эта база данных может быть изменена, и две разные JRE могут использовать две разные версии этой базы данных. вы можете проверить используемую версию базы данных как

      java -jar tzupdater.jar -V

Кажется, что JRE, используемая intellij, использует устаревшую базу данных часовых поясов IANA, которая включала зону ICT, это должна быть версия ранее 2017 года, поскольку ICT и другие изобретенные часовые пояса были удалены в выпуске 2017 года

Изменения сокращений часовых поясов в прошлом и будущем

Переключитесь на числовые сокращения часовых поясов для Южной Америки в рамках текущего проекта по удалению вымышленных сокращений. Это позволяет избежать необходимости изобретать аббревиатуру для новой чилийской новой зоны. Аналогичным образом переключитесь с придуманных сокращений часовых поясов на числовые для Афганистана, Американского Самоа, Азорских островов, Бангладеш, Бутана, Британской территории в Индийском океане, Брунея, Кабо-Верде, острова Чатем, Рождества I, острова Кокос (Килинг), острова Кука, Дубая. , Восточный Тимор, Евкла, Фиджи, Французская Полинезия, Гренландия, Индокитай

Чтобы получить доступные в настоящее время идентификаторы зоны, вы можете запросить jvm как

      java.util.TimeZone.getAvailableIDs()
// or
ZoneId.getAvailableZoneIds()
Другие вопросы по тегам