0

我有 UTC 的当前日期时间,但我需要时区(欧洲/伦敦)的日期时间。我试过但每次都没有添加,而不是在当前日期时间中添加这个偏移量。

我的代码 -

LocalDateTime utcTime = LocalDate.now().atTime(0,1);
System.out.println("utc time " + utcTime);
ZoneId europeLondonTimeZone = ZoneId.of("Europe/London");
ZoneOffset offset = europeLondonTimeZone.getRules().getOffset(utcTime);
OffsetDateTime offsetDateTime = utcTime.atOffset(offset);
System.out.println(offsetDateTime);

它将打印:

"2021-06-18T00:01+01:00"

但我想要

"2021-06-17T23:01"

因为 +01:00 在夏令时提前。

谢谢

4

1 回答 1

1

如果您只想要英国的当前时间,则无需从 UTC 转换。你可以直接有那个时间。

    ZoneId europeLondonTimeZone = ZoneId.of("Europe/London");
    OffsetDateTime offsetDateTime = OffsetDateTime.now(europeLondonTimeZone);
    System.out.println(offsetDateTime);

刚才运行代码时的输出:

2021-06-18T19:18:39.599+01:00

如果您确实需要首先获得 UTC 时间,请避免使用LocalDateor LocalDateTime。某些 java.time 类名中的local表示没有 time zone 或 UTC offset。Prefer OffsetDateTime,顾名思义,它本身会跟踪其偏移量。因此,当它采用 UTC 时,它本身就“知道”这个事实。

    // Sample UTC time
    OffsetDateTime utcTime = OffsetDateTime.now(ZoneOffset.UTC);
    System.out.println("UTC time: " + utcTime);

    ZoneId europeLondonTimeZone = ZoneId.of("Europe/London");
    OffsetDateTime offsetDateTime = utcTime.atZoneSameInstant(europeLondonTimeZone)
            .toOffsetDateTime();
    System.out.println("UK time:  " + offsetDateTime);
UTC time: 2021-06-18T18:18:39.669Z
UK time:  2021-06-18T19:18:39.669+01:00

atZoneSameInstant方法将其所在的任何偏移量OffsetDateTime(在本例中为 UTC)转换为作为参数传递的时区,因此通常会更改时钟时间(有时甚至是日期)。

你的代码出了什么问题?

ALocalDate只包含一个没有时间的日期,所以LocalDate.now()只告诉你它在 JVM 的默认时区中的哪一天(所以甚至不是它在 UTC 中的哪一天),而不是一天中的时间。.atTime(0,1)将那一天转换为表示当天LocalDateTime0 小时 1 分钟的时间,即 00:01,仍然没有任何时区。

此外,aZonedDateTime不仅知道其时区,还可以处理其时区规则。因此,您没有理由自己在特定时间处理偏移量。

最后LocalDateTime.atOffset()转换为OffsetDateTime但既不改变日期也不改变一天中的时间。由于LocalDateTime没有任何时区,该方法不能用于时区之间的转换。

于 2021-06-18T18:19:09.190 回答