如果您只想要英国的当前时间,则无需从 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 时间,请避免使用LocalDate
or 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)
将那一天转换为表示当天LocalDateTime
0 小时 1 分钟的时间,即 00:01,仍然没有任何时区。
此外,aZonedDateTime
不仅知道其时区,还可以处理其时区规则。因此,您没有理由自己在特定时间处理偏移量。
最后LocalDateTime.atOffset()
转换为OffsetDateTime
但既不改变日期也不改变一天中的时间。由于LocalDateTime
没有任何时区,该方法不能用于时区之间的转换。