如何获取本地时区与美国东海岸时区的时差?现有代码未正确读取PC时区问题排查
解决本地时区与美国东海岸时区的时差计算问题
嘿,我来帮你理清这个问题的核心所在~
你当前的代码其实是在计算美国东海岸时区和UTC的偏移量,而不是本地设备时区与东海岸的时差,这就是为什么不管你怎么修改本地时区,结果始终是纽约和UTC的差值(现在是夏令时,所以显示-04:00,冬令时会变成-05:00)。
问题根源
LocalDateTime.now()是一个无时区信息的时间对象,你用它去调用zone.getRules().getOffset(now),本质是在问:“在这个无时区的时间点,纽约时区和UTC的偏移是多少?”这个值只和纽约的夏令时规则有关,和你的本地时区完全无关,所以自然不会随本地时区变化。
正确的实现方式
想要得到本地时区与美国东海岸的时差,我们需要同时获取两个时区的当前偏移量,或者直接计算两个带时区时间的间隔,这里给你两种可行的写法:
方法一:通过时区偏移量计算
// 获取本地系统默认时区 ZoneId localZone = ZoneId.systemDefault(); // 美国东海岸时区 ZoneId nyZone = ZoneId.of("America/New_York"); // 获取当前UTC时间戳(无时区差异的绝对时间) Instant now = Instant.now(); // 分别获取两个时区当前的UTC偏移量 ZoneOffset localOffset = localZone.getRules().getOffset(now); ZoneOffset nyOffset = nyZone.getRules().getOffset(now); // 计算本地与东海岸的时差:本地偏移 - 纽约偏移 Duration timeDifference = Duration.between(nyOffset, localOffset); System.out.println("本地与美国东海岸的时差:" + timeDifference);
方法二:直接计算带时区时间的间隔
这种方式更直观,直接用带时区的时间对象计算差值:
// 本地当前带时区的时间 ZonedDateTime localNow = ZonedDateTime.now(); // 美国东海岸当前带时区的时间 ZonedDateTime nyNow = ZonedDateTime.now(ZoneId.of("America/New_York")); // 计算两个时区时间的间隔 Duration timeDifference = Duration.between(nyNow, localNow); System.out.println("本地与美国东海岸的时差:" + timeDifference);
额外说明
美国东海岸采用夏令时制度:每年3月到11月左右使用UTC-04:00,其余时间使用UTC-05:00。上面的两种写法都会自动适配夏令时的变化,不需要手动处理规则。
内容的提问来源于stack exchange,提问作者reddragon72
相关产品推荐
相关产品推荐

