特定时区的当前日期时间,带和不带 NodaTime 的 DST 偏移
Current date time in specific timezone with and without DST offset with NodaTime
我需要根据用户选择的时区同步设备上的设备内部时钟。
我正在使用以下代码获取该区域相对于系统时钟的当前时间:
var currentInstant = SystemClock.Instance.GetCurrentInstant().InZone(userTimezone);
但我还需要能够为该区域切换 enables/disables DST 标志,这意味着如果该区域当前有 DST 活动我需要能够减去它添加的偏移量,并且只设置具有标准偏移量的区域时间的内部时钟。
我找到了标准偏移量(虽然不是 100%,但这是正确的):
currentInstant.GetZoneInterval().StandardOffset;
但我不确定如何使用它获取时区时间?
听起来你快到了。你大概想要 OffsetDateTime
或 LocalDateTime
,你会得到这样的:
var now = SystemClock.Instance.GetCurrentInstant();
var zoneInterval = zone.GetZoneInterval(now);
var offset = zoneInterval.StandardOffset; // Ignore any savings
OffsetDateTime offsetNow = now.WithOffset(offset);
如果需要,您可以使用 offsetNow.LocalDateTime
获得 LocalDateTime
。
此时,您没有 ZonedDateTime
,因为您实际上没有这样的时区 - 您的 "zone without DST" 不是常规时区。但听起来这正是您所需要的。
正如 Matt 所说,这从根本上来说是个坏主意 - 我知道您已经尝试过让您的客户相信这一点,但可能值得提前考虑并确定当您的客户明白这是也是个坏主意...
我需要根据用户选择的时区同步设备上的设备内部时钟。 我正在使用以下代码获取该区域相对于系统时钟的当前时间:
var currentInstant = SystemClock.Instance.GetCurrentInstant().InZone(userTimezone);
但我还需要能够为该区域切换 enables/disables DST 标志,这意味着如果该区域当前有 DST 活动我需要能够减去它添加的偏移量,并且只设置具有标准偏移量的区域时间的内部时钟。
我找到了标准偏移量(虽然不是 100%,但这是正确的):
currentInstant.GetZoneInterval().StandardOffset;
但我不确定如何使用它获取时区时间?
听起来你快到了。你大概想要 OffsetDateTime
或 LocalDateTime
,你会得到这样的:
var now = SystemClock.Instance.GetCurrentInstant();
var zoneInterval = zone.GetZoneInterval(now);
var offset = zoneInterval.StandardOffset; // Ignore any savings
OffsetDateTime offsetNow = now.WithOffset(offset);
如果需要,您可以使用 offsetNow.LocalDateTime
获得 LocalDateTime
。
此时,您没有 ZonedDateTime
,因为您实际上没有这样的时区 - 您的 "zone without DST" 不是常规时区。但听起来这正是您所需要的。
正如 Matt 所说,这从根本上来说是个坏主意 - 我知道您已经尝试过让您的客户相信这一点,但可能值得提前考虑并确定当您的客户明白这是也是个坏主意...