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

Mar*_*ean 5 android date date-parsing kotlin

我正在尝试将字符串 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)
Run Code Online (Sandbox Code Playgroud)

我不断收到此错误:

java.text.ParseException: Unparseable date: "2021-12-16T11:00:00.000Z"
Run Code Online (Sandbox Code Playgroud)

小智 7

您应该使用与解析器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)
Run Code Online (Sandbox Code Playgroud)


Nit*_*ish 5

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

另外你不应该使用它,SimpleDateFormat因为它已经过时了

使用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
Run Code Online (Sandbox Code Playgroud)

以上日期采用 UTC 时区,如果您愿意,可以使用以下命令将其转换为系统默认时区withZoneSameInstant

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

注意: 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
    }
Run Code Online (Sandbox Code Playgroud)