gpt4 book ai didi

java - 从包括时区在内的秒数获取 LocalDateTime

转载 作者:塔克拉玛干 更新时间:2023-11-01 22:24:09 29 4
gpt4 key购买 nike

我从我们的计算机“第 0 天”(又名午夜,1970 年 1 月 1 日 UTC)获得以为单位的时间,我想将其转换为 LocalDateTime 实例。此代码将执行此操作:

LocalDateTime dateTime = LocalDateTime.ofEpochSecond(seconds, 0, ZoneOffset.UTC)

不过,我需要这个 LocalDateTime 在我的时区。将 ZoneOffset.UTC 更改为 ZineOffset.of("+2) 将使 LocalDateTime 显示正确的时间。(假设巴黎截至 2015 年 8 月 31 日)

但这或多或少是一个不完美的解决方法,因为它没有考虑夏令时。

所以我尝试了更多,找到了 ZonedDateTime 类。它也没有帮助我,但我被困在这里:

LocalDateTime localDateTime = LocalDateTime.ofEpochSecond(seconds, 0, ZoneOffset.UTC);
ZonedDateTime zonedDateTime = ZonedDateTime.of(localDateTime,ZoneId.systemDefault());

这根本不起作用,因为 ZonedDateTime 包含一个 LocalDateTime 然后包含一个 LocalTime 这是我在 UTC 中的时间,而不是在我当前的时区。

那么如何从 UTC 秒数值中获取(最好)系统时区的 LocalDateTime,包括夏令时(如果需要)?

最佳答案

您需要指定 ZoneId 以便考虑地理区域的夏令时。获取可用区域 ID 的列表:

System.out.println(ZoneId.getAvailableZoneIds());

使用正确的区域 ID,您将可以访问夏令时规则。

例如,在德国 (UTC+1),他们在 1940 年 (UTC+2) 实现了第一个夏令时。 1947 年,他们引入了夏令时,比标准冬令时提前两个小时 (=UTC+3)。这是 1940 年、1947 年、1970 年夏季(没有夏令时)和今天早上的示例:

Instant[] instants = new Instant[] {
LocalDateTime.of(1939, 6, 1, 0, 0).toInstant(ZoneOffset.UTC),
LocalDateTime.of(1940, 6, 1, 0, 0).toInstant(ZoneOffset.UTC),
LocalDateTime.of(1947, 6, 1, 0, 0).toInstant(ZoneOffset.UTC),
Instant.ofEpochSecond(0), // 1970-01-01T00:00:00 UTC
LocalDateTime.of(1970, 6, 1, 0, 0).toInstant(ZoneOffset.UTC),
Instant.now().truncatedTo(ChronoUnit.DAYS), // 2015-08-31T00:00:00 UTC
};

for (Instant instant : instants) {
LocalDateTime inBerlin = LocalDateTime.ofInstant(instant, ZoneId.of("Europe/Berlin"));
System.out.println("UTC " + instant.atOffset(ZoneOffset.UTC).toLocalDateTime());
System.out.println("BERLIN " + inBerlin);
System.out.println();
}

这将打印如下内容:

UTC    1939-06-01T00:00
BERLIN 1939-06-01T01:00

UTC 1940-06-01T00:00
BERLIN 1940-06-01T02:00

UTC 1947-06-01T00:00
BERLIN 1947-06-01T03:00

UTC 1970-01-01T00:00
BERLIN 1970-01-01T01:00

UTC 1970-06-01T00:00
BERLIN 1970-06-01T01:00

UTC 2015-08-31T00:00
BERLIN 2015-08-31T02:00

如您所见,规则已正确实现。柏林的第一个夏令时是 1940 年。1947 年,夏令时增加了一个小时类次。从 1950 年到 1980 年,根本没有夏令时。 1980 年,欧洲许多国家有计划地开始实行夏令时。

哦,回答你的问题:

LocalDateTime.ofInstant(Instant.ofEpochSecond(seconds), ZoneId.systemDefault())

关于java - 从包括时区在内的秒数获取 LocalDateTime,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32317984/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com