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()