问题描述
我需要从当前 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() ;
但是 Instant
是 java.time 中的基本构建块类。如果您在生成文本时需要更多的灵活性(例如格式化),请使用 OffsetDateTime
。
OffsetDateTime odt = zdt.toOffsetDateTime().withOffsetSameInstant( ZoneOffset.UTC ) ;