如何从包含UTC后缀的时间字符串解析生成LocalDateTime或Instant对象
解析带UTC标识的时间字符串方案
你原有代码的格式串没有匹配末尾的UTC时区标识,UTC属于时区短名称,对应DateTimeFormatter的模式符为z,调整格式串即可完成解析,以下是两种目标对象的实现方式:
1. 解析为Instant对象
Instant本身代表UTC时间线上的瞬时点,适合用来做时间存储、跨时区时间计算,解析代码如下:
import java.time.Instant; import java.time.ZonedDateTime; import java.time.format.DateTimeFormatter; import java.util.Locale; public class TimeParseDemo { public static void main(String[] args) { String dateTime = "2021-09-17 11:48:06 UTC"; // 构造匹配UTC标识的格式化器,指定Locale避免不同地区解析异常 DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss z", Locale.US); ZonedDateTime zonedDateTime = ZonedDateTime.parse(dateTime, formatter); Instant instant = zonedDateTime.toInstant(); System.out.println(instant); // 输出:2021-09-17T11:48:06Z } }
2. 解析为LocalDateTime对象
LocalDateTime不携带时区信息,需要先解析为带时区的ZonedDateTime,再根据需求转换为对应时区的LocalDateTime:
import java.time.LocalDateTime; import java.time.ZoneId; import java.time.ZoneOffset; import java.time.ZonedDateTime; import java.time.format.DateTimeFormatter; import java.util.Locale; public class TimeParseDemo { public static void main(String[] args) { String dateTime = "2021-09-17 11:48:06 UTC"; DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss z", Locale.US); ZonedDateTime zonedDateTime = ZonedDateTime.parse(dateTime, formatter); // 情况1:保留原UTC时区的时间数值,输出时分秒和原字符串一致 LocalDateTime utcLocalDateTime = zonedDateTime.withZoneSameInstant(ZoneOffset.UTC).toLocalDateTime(); System.out.println(utcLocalDateTime); // 输出:2021-09-17T11:48:06 // 情况2:转换为指定时区对应的本地时间,示例为东8区北京时间 LocalDateTime beijingLocalDateTime = zonedDateTime.withZoneSameInstant(ZoneId.of("Asia/Shanghai")).toLocalDateTime(); System.out.println(beijingLocalDateTime); // 输出:2021-09-17T19:48:06 } }
注意事项
- 构造
DateTimeFormatter时指定Locale.US,避免不同系统地区默认配置导致时区短名称解析失败。 - 不建议直接用
LocalDateTime.parse解析带时区的时间字符串,会丢失时区上下文,后续时间运算容易出现偏差。
内容的提问来源于stack exchange,提问作者Tendai
相关产品推荐
相关产品推荐

