我正在尝试解码从我的api接收的日期-时间在我需要的格式"yyyy-MM-dd">
我以2格式接收时间
1. "2022-05-05T11:32:12.542Z"
2. "2022-05-06T07:33:46.59928+00:00"
我能够通过使用以下模式解析它来解码第一种格式
"yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"
但是无法理解第二个条件的格式。
第二个条件的更多例子
"2022-05-06T06:30:25.583988+00:00"
"2022-05-05T11:32:49.393283+00:00"
注:我不需要解析逻辑,只需要模式
代码中用于解析第一个条件
的完整方法fun convertToFormat(src: String): String {
val originalFormat =
SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'", Locale.getDefault())
val targetFormat = SimpleDateFormat("yyyy-MM-dd")
val date = originalFormat.parse(src)
return targetFormat.format(date)
}
br
如果您只想提取输入字符串的日期部分,请分割。
"2022-05-05T11:32:12.542Z"
.split( "T" )
[ 0 ]
如果要解析输入字符串,请使用OffsetDateTime
&LocalDate
.
OffsetDateTime
.parse(
input
)
.toLocalDate()
.toString() ;
避免遗留类
你正在使用糟糕的日期时间类,这些类在几年前就被现代的java取代了。JSR 310定义的time类。禁止使用SimpleDateFormat
,Date
,Calendar
。
你的两个示例字符串都是标准的ISO 8601格式。java。time类在解析/生成文本时默认支持ISO 8601格式。因此不需要指定格式模式。
Instant
将输入解析为类Instant
的对象。
Instant instant1 = Instant.parse( "2022-05-05T11:32:12.542Z" ) ;
Instant instant2 = Instant.parse( "2022-05-06T07:33:46.59928+00:00" ) ;
查看此代码运行在IdeOne.com。
LocalDate
你只需要日期。因此,转换为更灵活的OffsetDateTime
,并提取LocalDate
。
LocalDate ld = Instant.atOffset( ZoneOffset.UTC ).toLocalDate() ;
然后调用LocalDate#toString
生成ISO 8601格式的文本YYYY-MM-DD。
我正在寻找SimpleDateFormat文档,并找到了这个参考:https://developer.android.com/reference/kotlin/java/text/SimpleDateFormat#examples
模式"yyyy-MM-dd'T'HH:mm:ss.SSSXXX" 2001-07-04T12:08:56.235-07:00
,看起来与你收到的非常相似(除了秒精度)。