为什么更改时区时 UTC 偏移量相同?

Why UTC offset is the same when time zone was changed?

这是我使用的代码:

TimeZone zone = TimeZone.CurrentTimeZone;
TimeSpan offset = zone.GetUtcOffset(DateTime.Now);

我的时区是+3,时差最初是3小时,没问题。但是,当我通过 Windows 7 控制面板将时区更改为 +6 时,偏移量仍然是 3。我不明白为什么。

TimeZone.CurrentTimeZone 读取一个延迟初始化的静态字段,它在第一次访问时 分配一次 并且如果您更改系统设置它将不会 destroyed/recreated 。来自反汇编的源代码:

public static TimeZone CurrentTimeZone {
    get {
        if (currentTimeZone != null)
            return currentTimeZone;

        lock (InternalSyncObject) {
            if (TimeZone.currentTimeZone == null)
                TimeZone.currentTimeZone = new CurrentSystemTimeZone();

            return TimeZone.currentTimeZone;
        }
    }
}

要"reset"它你必须卸载AppDomain或自己处理那个事件并调用TimeZoneInfo.ClearCachedData()方法(tnx tesicg,我原来的建议被删除下面的代码)。

var field = typeof(TimeZone).GetField("curretTimeZone", BindingFlags.NonPublic | BindingFlags.Static); field.SetValue(null, null); 将 `currentTimeZone` 重置为 null 会强制 `CurrentTimeZone` 在需要时重新创建它。请注意这里我们依赖于一个小的实现细节(字段名称和行为)所以你必须考虑你是否真的需要它。


你们的服务器会跨时区移动吗?如果没有,那么 不用担心...