一次日期转换遇到的问题
在一次时间解析的时候,碰到了2023-08-03T01:30:49.000+00:00
这种格式的时间,这种时间是UTC时间格式,T
代表分隔符,.000
是毫秒值,+00:00
代表时区偏移量,+00:00 表示 UTC 时间,就是时区
使用的日期格式为 yyyy-MM-dd'T'HH:mm:ss.SSSZ
,SSS
是毫秒值,Z
是时区偏移量
然后正常的操作是
-
创建一个格式为
yyyy-MM-dd'T'HH:mm:ss.SSSZ
的日期格式化类,比如DateTimeFormatter
-
创建一个日期类来接受格式化后的日期,这里用到
LocalDateTime
-
调用
LocalDateTime.
parse
完成字符串转换和格式化 -
如果时区不一样,还需要转时区
String dateTimeString = "2023-08-03T01:30:49.000+00:00";
DateTimeFormatter parser = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSSZ");
LocalDateTime utc0Date = LocalDateTime.parse(dateTimeString, parser);
System.out.println(utc0Date);
但是报错了
Text '2023-08-03T01:30:49.000+00:00' could not be parsed at index 23
证明这个日期的格式和yyyy-MM-dd'T'HH:mm:ss.SSSZ
不符
应该是用yyyy-MM-dd'T'HH:mm:ss.SSSXXX
这个格式
yyyy-MM-dd'T'HH:mm:ss.SSSXXX
和yyyy-MM-dd'T'HH:mm:ss.SSSZ
的区别是:
-
yyyy-MM-dd'T'HH:mm:ss.SSSXXX
格式包含时区偏移量例如
+08:00
表示东8区,-05:00
表示西5区。这种格式可以处理包含时区信息的日期时间字符串,如2023-08-03T01:30:49.000+08:00
-
yyyy-MM-dd'T'HH:mm:ss.SSSZ
格式使用Z表示UTC时间,它只能表示固定的时区标识例如
+0800
表示东8区,-0500
表示西5区。这种格式适用于没有具体时区偏移值,只有时区标识的日期时间字符串,如2023-08-03T01:30:49.000+0800
简单来说就是多了个时区部分多了一个:
的区别
更新的代码
String dateTimeString = "2023-08-03T01:30:49.000+00:00";
DateTimeFormatter parser = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSSXXX");
//时区转换类
ZonedDateTime utcDateTime = ZonedDateTime.parse(dateTimeString, parser);
//切换时区
ZonedDateTime utc8DateTime = utcDateTime.withZoneSameInstant(ZoneId.of("UTC+8"));
//转换成LocalDateTime
LocalDateTime localDateTime = utc8DateTime.toLocalDateTime();
System.out.println(localDateTime);
本文来自博客园,作者:阿弱,转载请注明原文链接:https://www.cnblogs.com/aruo/p/17603994.html