Avinash的回答是正确的。以下是一些额外的想法。
时区名称
BST
不是一个真正的时区名。也许你指的是Europe/London
。而那并不是GMT/UTC。伦敦时区的偏移量可能会因为夏令时(DST)和其他原因而有所变化。
UTC
让我们分别查看你在三个不同时区的时间。
首先,我们将你的输入解析为一个缺少时区或从UTC偏移量的上下文的LocalDateTime
对象。然后,我们为阿比让分配一个时区作为上下文以生成一个ZonedDateTime
对象。我们进行调整以适应另一个时区,得到第二个ZonedDateTime
对象,它代表了相同的瞬间、时间线上的同一点,但是在不同的挂钟时间上。最后,我们提取一个Instant
对象,以实际调整为UTC。一个Instant
始终表示UTC中的一个瞬间。保留HTML标记。
LocalDateTime ldt = LocalDateTime.parse( "2021-09-16T12:00" ) ;
ZonedDateTime zdtAbidjan = ldt.atZone( ZoneId.of( "Africa/Abidjan" ) ) ;
ZonedDateTime zdtLondon = zdtAbidjan.withZoneSameInstant( ZoneId.of( "Europe/London" ) ) ;
Instant instant = zdtAbidjan.toInstant() ;
请在 IdeOne.com 上查看此代码的实时运行情况。
ldt: 2021-09-16T12:00
zdtAbidjan: 2021-09-16T12:00Z[Africa/Abidjan]
zdtLondon: 2021-09-16T13:00+01:00[Europe/London]
instant: 2021-09-16T12:00:00Z
Z
表示零小时-零分钟-零秒的偏移量,发音为“Zulu”。因此,我们可以看到科特迪瓦的那个九月日子中午的时间与UTC相同,具有零偏移量。相比之下, +01:00
告诉我们伦敦时间比UTC快一小时。所以时钟显示的是下午1点(13:00
),而不是中午。
获取偏移量
您可以通过使用 ZoneRules
类来确定某个特定时刻生效的偏移量信息。偏移量信息由 ZoneOffset
类表示。
ZoneId z = ZoneId.of( "Africa/Abidjan" ) ;
ZoneRules rules = z.getRules() ;
ZoneOffset offset = rules.getOffset( LocalDateTime.parse( "2021-09-16T12:00" ) ) ;
int offsetInSeconds = offset.getTotalSeconds() ;
或者简化为:
ZoneId
.of( "Africa/Abidjan" )
.getRules()
.getOffset( LocalDateTime.parse( "2021-09-16T12:00" ) )
.getTotalSeconds()
运行后,我们再次看到科特迪瓦在该日期时间使用零偏移。
rules: ZoneRules[currentStandardOffset=Z]
offset: Z
offsetInSeconds: 0
![Table of date-time types in Java, both modern and legacy](https://istack.dev59.com/yciGt.webp)