将长格式的时间从UTC到EST

Convert time in long format from UTC to EST

提问人:Rohan 提问时间:9/6/2023 最后编辑:Federico klez CullocaRohan 更新时间:9/7/2023 访问量:77

问:

寻找将时间(毫秒)从UTC转换为EST 以以下方式尝试,但没有奏效。我看到epcohET与输入参数相同。

long time = 1693932120000
Instant dateTime = Instant.ofEpochMilli(time);
ZoneId usET = ServerTimeZone.TimeZone.getTimeZone("America/New_York").toZoneId();
ZonedDateTime zdt = ZonedDateTime.ofInstant(dateTime, usET);
long epochET = zdt.toInstant().toEpochMilli();
Java zoneddatetime

评论

6赞 Petr Janeček 9/6/2023
无论区域如何,即时都是相同的,这就是它们的意思。它是全球(通用)时间线上的一个即时点。自某个时间点以来的秒数和纳数。整个星球都是一样的。改变的是 OffsetDateTime / ZonedDateTime,因为这是您在地球上不同地方时在特定时刻观察到的时间。换句话说,瞬间永远不会改变,到处都是一样的。如果需要特定地点的时间,请使用 Offset/Zoned*。
2赞 Don Branson 9/6/2023
以米利斯为单位的大纪元时间是 1970 年 1 月 1 日在格林威治的米数。因此,时区无关紧要,epochET 应该与输入相同。
1赞 Don Branson 9/6/2023
@Rohan 没有转化,因为它们具有相同的价值。无论您在哪个时区,这都是一样的,因为纪元的乞求是基于 UTC,而不是本地时区。
1赞 Rohan 9/6/2023
意义。谢谢@DonBranson
2赞 Basil Bourque 9/6/2023
“EST”和“ET”不是实时时区。实时区的名称格式为 和 。Continent/RegionAmerica/New_YorkAmerica/Montreal

答:

3赞 Arvind Kumar Avinash 9/6/2023 #1

即时仅表示某个时刻,与时区无关。

您可以使用 Instant#atZone 来获得所需的结果。

演示:

class Main {
    public static void main(String[] args) {
        long timestamp = 1693932120000L;
        Instant instant = Instant.ofEpochMilli(timestamp);
        ZonedDateTime zdt = instant.atZone(ZoneId.of("America/New_York"));
        System.out.println(zdt);
    }
}

输出:

2023-09-05T12:42-04:00[America/New_York]

在线演示

从 Trail 了解新式日期时间 API:日期时间

评论

0赞 Rohan 9/6/2023
我预计输出也会很长。但我的理解是,长将与输入相同,不会改变。
1赞 Arvind Kumar Avinash 9/6/2023
@Rohan没错。时间戳与时区无关。如果您想了解与日期时间相关的概念,我在回答中链接的文档和教程将对您非常有帮助。long
1赞 WJS 9/6/2023 #2

那么有没有其他方法可以将长时间从UTC转换为ET(不使用ZonedDateTime)?

如果你说的是从一个多头到另一个多头,不。时刻和纪元没有时区(尽管被视为用于调整目的)。TZInstantZulu

如果您只想获取一个时间对象并且不关心信息,而只想针对某些对象进行调整,这将起作用。如果要包含在输出中,只需将调用替换为 Try it like this,但使用您的特定区域。请注意,如果打印出 ,则默认为 或 。因此,任何调整都将从这一点开始。timezonelong millitimezoneLocalDateTimetimezonesLocalDateTimeZonedDateTimeInstantZuluUTCTZ

Long millis = 1694009579442L;
Instant instant = Instant.ofEpochMilli(millis);


LocalDateTime ldt1 = LocalDateTime.ofInstant(instant,
        ZoneId.of("US/Eastern"));
LocalDateTime ldt2 = LocalDateTime.ofInstant(instant,
        ZoneId.of("Europe/Paris"));
System.out.println(ldt1);
System.out.println(ldt2);

指纹

2023-09-06T10:12:59.442
2023-09-06T16:12:59.442