特定时区的当前日期时间,带和不带 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;

但我不确定如何使用它获取时区时间?

听起来你快到了。你大概想要 OffsetDateTimeLocalDateTime,你会得到这样的:

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 所说,这从根本上来说是个坏主意 - 我知道您已经尝试过让您的客户相信这一点,但可能值得提前考虑并确定当您的客户明白这是也是个坏主意...