一次日期转换遇到的问题

在一次时间解析的时候,碰到了2023-08-03T01:30:49.000+00:00这种格式的时间,这种时间是UTC时间格式,T代表分隔符,.000是毫秒值,+00:00代表时区偏移量,+00:00 表示 UTC 时间,就是时区

使用的日期格式为 yyyy-MM-dd'T'HH:mm:ss.SSSZSSS是毫秒值,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.SSSXXXyyyy-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);
posted @ 2023-08-03 17:32  阿弱  阅读(342)  评论(0编辑  收藏  举报