UTC长整型时间(毫秒)转EST失败求助:结果与输入一致
UTC毫秒时间转EST时区的正确处理方式
你的代码问题在于:zdt.toInstant().toEpochMilli()会把EST时区的ZonedDateTime重新转回UTC时间轴上的Instant,而Instant是UTC时间线上的绝对点,和时区无关,所以最终得到的毫秒数必然和原输入一致。
核心概念澄清
epoch毫秒数的定义是从UTC 1970-01-01 00:00:00开始的毫秒数,不存在“EST时区的epoch毫秒”——所有epoch毫秒都是基于UTC基准的。时区的作用是把UTC时间轴上的点(Instant)转换为对应时区的本地时间表示,或者反过来将本地时间映射到UTC时间轴。
正确实现方案
根据你的实际需求选择对应的代码:
需求1:获取UTC毫秒对应的EST本地时间(年/月/日/时/分/秒或格式化字符串)
long utcEpochMilli = 1693932120000L; Instant utcInstant = Instant.ofEpochMilli(utcEpochMilli); ZoneId estZone = ZoneId.of("America/New_York"); ZonedDateTime estZdt = ZonedDateTime.ofInstant(utcInstant, estZone); // 获取EST本地时间的各个字段 int year = estZdt.getYear(); int month = estZdt.getMonthValue(); int day = estZdt.getDayOfMonth(); int hour = estZdt.getHour(); int minute = estZdt.getMinute(); // 或者格式化输出带时区的时间字符串 DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss zzz"); String estTimeStr = estZdt.format(formatter); System.out.println(estTimeStr); // 输出示例:2023-09-05 08:02:00 EDT(纽约时区夏季用EDT,冬季自动切换为EST)
需求2:将EST本地时间转换为UTC毫秒数
如果是要把EST时区的某个本地时间转成UTC毫秒,代码如下:
// 构造EST时区的本地时间:2023-09-05 08:02:00 LocalDateTime estLocalTime = LocalDateTime.of(2023, 9, 5, 8, 2, 0); ZoneId estZone = ZoneId.of("America/New_York"); ZonedDateTime estZdt = ZonedDateTime.of(estLocalTime, estZone); long utcEpochMilli = estZdt.toInstant().toEpochMilli(); System.out.println(utcEpochMilli); // 输出:1693932120000
内容的提问来源于stack exchange,提问作者Rohan
相关产品推荐
相关产品推荐

