如果启用 DST,则需要从当前 UTC 时间中减去欧洲/伦敦偏移量

问题描述

我需要从当前 UTC 时间中减去时区偏移量 示例 -> 在下面的代码中, 在 dateTime 变量中,日期是今天和我设置的时间 00:01,然后我得到了“欧洲/伦敦”的偏移量。

如果没有偏移量比偏移量“Z”会来,但如果有一些 偏移,比在“欧洲/伦敦”->“+01:00”(夏令时)的情况下会来。因此,根据要求,如果偏移量来了,我必须减去该偏移量而不是添加它。但如果没有偏移量,则不需要做任何事情

我目前的代码实现 -

LocalDateTime dateTime = LocalDate.Now().atTime(0,1);
ZoneId europeLondonTimeZone = ZoneId.of("Europe/London");
ZoneOffset offset = europeLondonTimeZone.getRules().getoffset(dateTime);
if (!offset.toString().equals("Z")){
   dateTime = dateTime.minusHours(1);
}

但我认为它不是通用的。如果有更好的方法,请在下方评论

注意 - 这里我是从 UTC 中减去偏移量而不是添加它。

解决方法

tl;博士

LocalDate
.now( 
    ZoneId.of( "Europe/London" ) 
)
.atTime( 0,1 )
.atZone( 
    ZoneId.of( "Europe/London" ) 
)
.toOffsetDateTime()
.withOffsetSameInstant( 
    ZoneOffset.UTC
)

详情

您的问题过于复杂且令人困惑。但是我猜您想在时区中看到的午夜过后一分钟获取当前日期,并调整到 UTC(与 UTC 零时分秒的偏移量。

您的代码在获取当前日期时忽略了指定时区。对于任何给定时刻,日期在全球各地因时区而异。所以时区很重要。如果省略,则应用 JVM 当前的默认时区。

ZoneId z = ZoneId.of( "Europe/London" ) ;
LocalDate today = LocalDate.now( z ) ;

应用一天中的时间来生成 LocalDateTime

LocalDateTime ldt = today.atTime( 0,1 ) ;

应用时区来确定时刻,即时间轴上的特定点。请注意,如果您的时间在该区域的那个日期无效,例如在夏令时 (DST) 切换期间,ZonedDateTime 会调整一天中的时间。

ZonedDateTime zdt = ldt.atZone( z ) ;

您想调整到 UTC。无需自己管理偏移计算。让 java.time 来完成工作。

您可以提取一个 Instant。此类代表以 UTC 表示的时刻,始终为 UTC。

Instant instant = zdt.toInstant() ;

但是 Instantjava.time 中的基本构建块类。如果您在生成文本时需要更多的灵活性(例如格式化),请使用 OffsetDateTime

OffsetDateTime odt = zdt.toOffsetDateTime().withOffsetSameInstant( ZoneOffset.UTC ) ;