Java Time:如何将偏移量转换为时区名称(如EST)
问题:将时区偏移格式转换为时区缩写(如EST)
你遇到的问题很典型:解析带时区偏移的时间字符串后,格式化时只能得到-05:00而不是预期的EST。这是因为你的代码只解析了时区偏移量,但没有把它关联到具体的时区标识(比如America/New_York),Java自然不知道这个偏移对应的是EST时区。
先回顾下你原来的代码:
String targetFormat = "uuuu-MM-dd'T'HH:mm:ss z"; String origFormat = "uuuu-MM-dd'T'HH:mm:ss.SSSZ"; String origStr = "2018-02-05T17:25:18.156-0500"; ZonedDateTime time = ZonedDateTime.parse(origStr, DateTimeFormatter.ofPattern(origFormat)); String targetStr = time.format(DateTimeFormatter.ofPattern(targetFormat));
输出结果:2018-02-05T17:25:18 -05:00
解决思路
要显示EST这类时区缩写,核心是把解析出的偏移时间关联到具体的标准时区ID。因为同一个偏移量可能对应多个时区,必须明确指定你要使用的时区(比如美国东部时区对应的America/New_York)。
修改后的代码
import java.time.OffsetDateTime; import java.time.ZoneId; import java.time.ZonedDateTime; import java.time.format.DateTimeFormatter; public class TimeZoneFormatting { public static void main(String[] args) { String targetFormat = "uuuu-MM-dd'T'HH:mm:ss z"; String origFormat = "uuuu-MM-dd'T'HH:mm:ss.SSSZ"; String origStr = "2018-02-05T17:25:18.156-0500"; // 先解析为OffsetDateTime:原字符串只有偏移量,没有时区ID OffsetDateTime offsetDateTime = OffsetDateTime.parse(origStr, DateTimeFormatter.ofPattern(origFormat)); // 关联到指定时区:这里用美国东部时区的标准ID ZonedDateTime zonedDateTime = offsetDateTime.atZoneSameInstant(ZoneId.of("America/New_York")); // 格式化输出 String targetStr = zonedDateTime.format(DateTimeFormatter.ofPattern(targetFormat)); System.out.println(targetStr); } }
运行这段代码,就能得到你预期的结果:2018-02-05T17:25:18 EST
额外说明
- 为什么用
America/New_York而非直接用EST?因为EST只是时区缩写,不是标准的时区ID,而且无法区分夏令时(美国东部夏令时是EDT)。使用America/New_York这类标准ID,Java会自动根据日期判断显示EST还是EDT——比如把日期改成夏季的2018-07-05T17:25:18.156-0400,输出会自动变成EDT,这更符合实际时区规则。 - 如果硬要固定显示
EST(不推荐,不符合时区逻辑),可以自定义格式化器,但这会忽略夏令时的实际变化。
内容的提问来源于stack exchange,提问作者user2777473
相关产品推荐
相关产品推荐

