Answer by Avinash 是正确的。这里还有一些想法。
时区名称
BST 不是real time zone name。也许你的意思是Europe/London。那是不是 GMT/UTC。由于Daylight Saving Time (DST) 和其他原因,伦敦时区的偏移量可能会有所不同。
UTC
让我们看看您在三个不同时区的每一刻。
首先,我们将您的输入解析为 LocalDateTime,缺少时区上下文或与 UTC 的偏移量。然后我们为Abidjan 分配一个时区作为上下文来生成ZonedDateTime 对象。我们调整到另一个时区,产生第二个ZonedDateTime,它代表同一时刻,时间轴上的同一点,但挂钟时间不同。最后,我们提取Instant 以有效地适应UTC。 Instant 代表 UTC 中的时刻,始终采用 UTC。
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() ; // Adjust to UTC by extracting an `Instant` object.
看到这个code run live at 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”。因此,我们可以看到科特迪瓦 9 月那天的中午与 UTC 相同,偏移量为零。相比之下,+01:00 告诉我们伦敦时间提前了一个小时。所以时钟显示为下午 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