【问题标题】:Failed to parse date ["2021-05-06 15:24:26 CEST"]: Invalid time zone indicator ' ', but timezone exists无法解析日期 [“2021-05-06 15:24:26 CEST”]:时区指示符 ' ' 无效,但时区存在
【发布时间】:2021-05-06 13:43:48
【问题描述】:

我在 Kotlin 中的日期格式模式上有些挣扎。 我有一个 PHP 后端,它以"Y-m-d H:i:s T" 格式格式化日期,正如您可能从标题中猜到的那样,结果为:[“2021-05-06 15:24:26 CEST”]。如您所见,还有一个时区,在我们的例子中是“CEST”。 但是,我的 Kotlin 应用程序告诉我,“”是无效的时区格式。 我对使用的不同模式感到非常困惑,我花了一段时间才掌握,所以模式内部可能存在错误。 在 Kotlin 中,我有以下 GSONBuilder:

val gson = GsonBuilder().setLenient().setDateFormat("yyyy-MM-dd HH:mm:ss z").create()

我也尝试了"yyyy-MM-dd H:m:s z""yyyy-MM-dd HH:mm:ss Z" 的模式,但也没有用。我的模式有错误吗?我的意思是,时区是结果的一部分。如果是,正确的模式是什么?

注意:如果可能有帮助,调试器会告诉我索引越界异常。

编辑: 缩短的异常堆栈:

E/AndroidRuntime: FATAL EXCEPTION: main
    Process: app, PID: 27254
    com.google.gson.JsonSyntaxException: 2021-05-11 10:07:04 CEST
        at com.google.gson.DefaultDateTypeAdapter.deserializeToDate(DefaultDateTypeAdapter.java:151)
        at com.google.gson.DefaultDateTypeAdapter.read(DefaultDateTypeAdapter.java:128)
        at 
...
com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.read(TypeAdapterRuntimeTypeWrapper.java:41)
...
retrofit2.converter.gson.GsonResponseBodyConverter.convert(GsonResponseBodyConverter.java:40)
...
        at retrofit2.OkHttpCall.parseResponse(OkHttpCall.java:243)
        at retrofit2.OkHttpCall$1.onResponse(OkHttpCall.java:153)
        at okhttp3.RealCall$AsyncCall.execute(RealCall.java:174)
        at okhttp3.internal.NamedRunnable.run(NamedRunnable.java:32)
        at 
...
     Caused by: java.text.ParseException: Failed to parse date ["2021-05-11 10:07:04 CEST"]: Invalid time zone indicator ' '
        at com.google.gson.internal.bind.util.ISO8601Utils.parse(ISO8601Utils.java:274)
        at com.google.gson.DefaultDateTypeAdapter.deserializeToDate(DefaultDateTypeAdapter.java:149)
        at 
... (Same as first stack trace)
     Caused by: java.lang.IndexOutOfBoundsException: Invalid time zone indicator ' '
        at com.google.gson.internal.bind.util.ISO8601Utils.parse(ISO8601Utils.java:245)
        at com.google.gson.DefaultDateTypeAdapter.deserializeToDate(DefaultDateTypeAdapter.java:149) 
        at 
... (same as first stack trace)

编辑 2: 由于 CEST 确实不是有效的 Java ID,我将 PHP 格式从 "Y-m-d H:i:s T" 更改为 "Y-m-d H:i:s e",现在结果为“2021-05-11 10:07:04 Europe/Berlin”,并且确实是一个有效的时区标识符到cutikos评论。 但是,错误还是一样。

【问题讨论】:

标签: php date kotlin format


【解决方案1】:

解决方案非常简单: java 格式 "yyyy-MM-dd HH:mm:ss Z" 只接受数字 "00a0" 格式,所以正确的 PHP 格式应该是: "Y-m-d H:i:s O"

希望这可以帮助另一个在日期格式约定中苦苦挣扎的人。

【讨论】:

    猜你喜欢
    • 2021-07-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-09
    • 1970-01-01
    • 1970-01-01
    • 2016-09-12
    相关资源
    最近更新 更多