为啥我无法解析这种日期格式 yyyy-MM-dd'T'HH:mm:ss.SSSZ?

Posted

技术标签:

【中文标题】为啥我无法解析这种日期格式 yyyy-MM-dd\'T\'HH:mm:ss.SSSZ?【英文标题】:Why I can't parse this date format yyyy-MM-dd'T'HH:mm:ss.SSSZ?为什么我无法解析这种日期格式 yyyy-MM-dd'T'HH:mm:ss.SSSZ? 【发布时间】:2022-01-20 10:46:53 【问题描述】:

我正在尝试将字符串 date 解析为 date 。我的字符串日期是:2021-12-16T11:00:00.000Z。

我有以下代码将其解析为日期对象:

val stringDate = "2021-12-16T16:42:00.000Z"
val sdf = SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ")
var consultationDate = sdf.parse(stringDate)

我不断收到此错误:

java.text.ParseException: Unparseable date: "2021-12-16T11:00:00.000Z"

【问题讨论】:

【参考方案1】:

您应该使用 Z 与使用 T 相同的方式让解析器识别格式中的字符

val stringDate = "2021-12-16T16:42:00.000Z"
val sdf = SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'")
var consultationDate = sdf.parse(stringDate)

【讨论】:

我不知道 SimpleDateFormat 是如何工作的,但这似乎是错误的。你永远不应该逃避/忽略 Z。这意味着 UTC timezone 。如果您逃避它,您将丢弃该日期的时区信息。尝试使用 yyyy-MM-dd'T'HH:mm:ss.SSSXXXXXX 或 yyyy-MM-dd'T'HH:mm:ss.SSSXXXX 解析。 看来你不能使用超过 3 X 与 SimpleDateFormat。如果 Z 不起作用,则不确定您需要为时区传递什么,但请确保解析不会丢弃 UTC 时区。在我看来,它会使用当前时区解析它。 尝试使用 XXX 或 XX。如果您想转义 Z,则需要将解析器的时区设置为 UTC,并确保时区始终带有 Z。也许这篇文章有助于***.com/a/3914498/2303865【参考方案2】:

正如@Leo Dabus 提到的那样你永远不应该逃避/忽略 Z。这意味着 UTC 时区。 - 因为它将使用当前时区解析它。

另外你不应该使用SimpleDateFormat,因为它是outdated

使用ZonedDateTimeOffsetDateTime解析特定区域的日期。

val date = "2021-12-16T16:42:00.000Z" // your date
// date is already in Standard ISO format so you don't need custom formatted
val dateTime : ZonedDateTime = OffsetDateTime.parse(date).toZonedDateTime()  // parsed date 
// format date object to specific format if needed
val formatter = DateTimeFormatter.ofPattern("MMM dd, yyyy HH:mm") 
Log.e("Date 1", dateTime.format(formatter)) // output : Dec 16, 2021 16:42

高于 UTC 时区的日期,如果需要,可以使用 withZoneSameInstant 将其转换为系统默认时区

val defaultZoneTime: ZonedDateTime = dateTime.withZoneSameInstant(ZoneId.systemDefault())
Log.e("Date 1", defaultZoneTime.format(formatter)) // output : Dec 16, 2021 22:12

注意: ZonedDateTime 仅适用于 android 8 及以上版本,在 android 8 下使用需启用脱糖功能。

在您的应用模块的build.gradle 中,添加coreLibraryDesugaringEnabled

 compileOptions 
        // Flag to enable support for the new language APIs
        coreLibraryDesugaringEnabled true
        // Sets Java compatibility to Java 8
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    

【讨论】:

以上是关于为啥我无法解析这种日期格式 yyyy-MM-dd'T'HH:mm:ss.SSSZ?的主要内容,如果未能解决你的问题,请参考以下文章

为啥“YYYY-MM-DD”日期格式的两个字符串在PHP中的小于或大于比较工作,即使它们是字符串?

使用 MagicalRecord 和日期格式进行 DateTime 解析

java中日期格式的转换,String类型的如:03/Jun/2013这种格式的,怎样转换成yyyy-mm-dd格式的?

无法从格式“yyyy-MM-dd'T'HH:mm:ss+00:00”创建日期

日期格式 - DD-MM-YYYY 到 YYYY-MM-DD

SQL 将日期转换为 yyyy-mm-dd