Datetime 如何将UTC日期时间解析为用户';s locale与现代java.time?

Datetime 如何将UTC日期时间解析为用户';s locale与现代java.time?,datetime,kotlin,Datetime,Kotlin,我从API中获得以下字符串,它是UTC格式的,但是其中没有时区定义yyyy-MM-dd HH:MM:ss 我想将其解析为dateTime并将其转换为用户的语言环境,然后将其显示为h:mm a。我想用现代的java.time 所以我想到了这个: val dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss") val endDateString = "2020-12-21 20:32:

我从API中获得以下字符串,它是UTC格式的,但是其中没有时区定义<代码>yyyy-MM-dd HH:MM:ss

我想将其解析为dateTime并将其转换为用户的语言环境,然后将其显示为
h:mm a
。我想用现代的java.time

所以我想到了这个:

val dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")
val endDateString = "2020-12-21 20:32:39"

val odtInstanceAtOffset = OffsetDateTime.parse(endDateString, dateTimeFormatter)
^它在这里坠毁了

java.time.format.DateTimeParseException:文本“2020-12-21 20:32:39” 无法分析:无法从中获取OffsetDateTime 临时助理:{},ISO解析为2020-12-21T20:32:39类型 java.time.format.Parsed

所以不确定这是不是正确的方法。我假设此时,如果我可以将该字符串转换为UTC日期时间实例,我可以继续如下操作:

val localDate: LocalDate = utcDatetime.toInstant().atZone(ZoneId.systemDefault()).toLocalDate()
val formatter: DateTimeFormatter = DateTimeFormatter.ofPattern("hh:mm a")
val displayDate: String = formatter.format(localDate)

正确吗?

您需要将区域信息添加到
DateTimeFormatter
中,然后可以使用
DateTimeFormatter
解析字符串。其结果是一个
TemporalAccessor
对象,然后可以将其格式化为所需的格式。像这样:

val endDateString=“2020-12-21 20:32:39”
val utcDateTimeFormatter=DateTimeFormatter
模式的名称(“yyyy-MM-dd HH:MM:ss”)
.withZone(ZoneOffset.UTC)
val localDateTimeFormatter=DateTimeFormatter
模式的名称(“hh:mm a”)
.withZone(ZoneId.systemDefault())
val displayDate=utcDateTimeFormatter.parse(endDateString){temporal->
localDateTimeFormatter.format(时态)
}

谢谢你指出这一点。我已经更新了这个问题。也许这是一个新问题,但由于这是纯字符串转换,我仍然没有日期对象。如何将日期与当前日期进行比较
if(todayDate.after(endDate){…}
您可以查看我的答案的以前版本。在第一个版本中,我使用
Instant
对象初始化了一个变量。您可以在
Instant
中找到合适的方法进行比较。
val localDate: LocalDate = utcDatetime.toInstant().atZone(ZoneId.systemDefault()).toLocalDate()
val formatter: DateTimeFormatter = DateTimeFormatter.ofPattern("hh:mm a")
val displayDate: String = formatter.format(localDate)