2015-02-09 82 views
2

下面是我使用的代码:为什么在时区更改时UTC偏移量相同?

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

我的时区是+3和偏移量是initally 3个小时,这是罚款。但是,当我通过Windows 7控制面板将时区更改为+6时,偏移量仍然为3.我不明白为什么。

+0

你是否正在更改服务器上的时区?时区更改是否生效? – shahkalpesh 2015-02-09 13:42:24

+0

IIS位于我的语言环境机器上。 – tesicg 2015-02-09 13:48:56

回答

2

TimeZone.CurrentTimeZone读取延迟初始化静态字段,它在第一次访问分配一次,它也不会被破坏/如果你改变系统设置重新创建。从反汇编代码:

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

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

      return TimeZone.currentTimeZone; 
     } 
    } 
} 

“重置”它,你必须卸载AppDomain中或自行处理该事件,并调用TimeZoneInfo.ClearCachedData()方法(TNX tesicg,我原来建议如下删除代码)。

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


您的服务器是否会跨时区移动?如果不是那么不要担心关于它...

+0

我也注意到相同的代码在普通的控制台应用程序中工作正常。但是,不在我的ASP.NET应用程序中。 – tesicg 2015-02-10 06:43:15

+0

@tesicg它仅适用于**如果您重新运行您的控制台应用程序。如果你阅读它,等待一个按键,改变设置,按下一个键并重新阅读,那么你显然会得到相同的值(因为它现在存储在一个静态字段中,只有在你第一次阅读它时才初始化)。 ASP.NET将不会重新读取,直到进程将重新启动(或者当IIS决定在另一个进程中为请求提供服务时)。 – 2015-02-10 08:15:31

+0

你说得对。与此同时,我发现这也适用: TimeZoneInfo.ClearCachedData(); TimeZoneInfo local = TimeZoneInfo.Local; TimeSpan offset = local.GetUtcOffset(DateTime.Now); – tesicg 2015-02-10 09:23:00

相关问题