从秒开始获取LocalDateTime,包括时区

时间:2015-08-31 18:51:17

标签: java datetime

我在计算机“第0天”(又称1970年1月1日午夜)的 时间,我希望将其转换为 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时间,而不是在我当前的时区。< / p>

那么如何从(优选地)系统时区中获得LocalDateTime,包括夏令时(如果需要),从UTC秒的节拍值?

1 个答案:

答案 0 :(得分:7)

您需要指定ZoneId才能将地理区域的夏令时考虑在内。获取可用区域ID列表:

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

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

例如,在德国(UTC + 1),他们在1940年首次采用了夏令时(UTC + 2)。 1947年,他们推出了 mid 夏季时间,比标准冬季时间早2小时(= 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())