为什么我无法解析这种日期格式 yyyy-MM-dd'T'HH:mm:ss.SSSZ?
Why I can't parse this date format yyyy-MM-dd'T'HH:mm:ss.SSSZ?
我正在尝试将字符串日期解析为日期。我的字符串日期是: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"
您应该像使用 T
一样使用 Z
让解析器识别格式
中的字符
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)
正如@Leo Dabus 提到的那样你永远不应该escape/ignore Z。这意味着UTC 时区。 - 因为它将使用当前时区解析它。
另外你不应该使用 SimpleDateFormat
因为它是 outdated
使用ZonedDateTime
和OffsetDateTime
解析特定时区的日期。
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
只在android8及以上有效,android8以下要使用它启用脱糖。
在您的应用模块的 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
}
我正在尝试将字符串日期解析为日期。我的字符串日期是: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"
您应该像使用 T
一样使用 Z
让解析器识别格式
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)
正如@Leo Dabus 提到的那样你永远不应该escape/ignore Z。这意味着UTC 时区。 - 因为它将使用当前时区解析它。
另外你不应该使用 SimpleDateFormat
因为它是 outdated
使用ZonedDateTime
和OffsetDateTime
解析特定时区的日期。
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
只在android8及以上有效,android8以下要使用它启用脱糖。
在您的应用模块的 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
}