我有一段代码试图在Windows(嵌入式7)上禁用夏令时,但是我想到了一种奇怪的方式(我认为)。不幸的是,代码是由其他很久以前离开的人编写的,我不确定他们想要做什么。
DynamicTimeZoneInformation timeZoneInfo;
GetDynamicTimeZoneInformation(out timeZoneInfo);
timeZoneInfo.DisableDynamicDaylightTime();
// Disable windows daylight saving time.
DateTimeOffset ptime = DateTimeOffset.Now;
bool enabled = SecurityApi.EnablePrivilege("SeTimeZonePrivilege");
bool changed = SetDynamicTimeZoneInformation(ref timeZoneInfo);
bool disabled = SecurityApi.DisablePrivilege("SeTimeZonePrivilege");
TimeZoneInfo.ClearCachedData();
和...
public void DisableDynamicDaylightTime()
{
this.DynamicDaylightTimeDisabled = true;
this.Bias = 0;
this.StandardDate.Year = 0;
this.StandardDate.Month = 0;
this.StandardDate.Day = 0;
this.StandardDate.Hour = 0;
this.StandardDate.Minute = 0;
this.StandardDate.Second = 0;
this.StandardDate.Milliseconds = 0;
this.StandardDate.DayOfWeek = 0;
this.StandardBias = 0;
this.DaylightDate.Year = 0;
this.DaylightDate.Month = 0;
this.DaylightDate.Day = 0;
this.DaylightDate.Hour = 0;
this.DaylightDate.Minute = 0;
this.DaylightDate.Second = 0;
this.DaylightDate.Milliseconds = 0;
this.DaylightDate.DayOfWeek = 0;
this.DaylightBias = 0;
}
现在,稍后会有代码通过将偏移量添加到Utc Time来将时钟更改回本地时区,但这不是我的问题所在。
我的问题是这个。假设我将时区(通过Windows)设置为巴格达,即UTC + 3:00。当前时间11:00当我得到时区信息时,它的Bias
为-180,StandardBias
为-60。上面的代码将Biases设置为0,然后我调用SetDynamicTimeZoneInformation()
。正如预期的那样,时间设置回到08:00(因为偏差现在为0)。
然而,当它到达TimeZoneInfo.ClearCachedData()
时,它将UTC时间(即DateTimeOffset.Now.UtcDateTime
)设置为05:00!再过3个小时。我原本期望UTC时间和当前显示的系统时间相同,因为偏差为0。
这是SetDynamicTimeZoneInformation()
的预期行为吗?这似乎更奇怪,因为我有另一个项目,该部分具有相同的代码,但不执行此操作 - 它的行为与我在上一段中的预期相同。 (因此UTC时间将保持在08:00)
我能看到的唯一区别就是使用.Net Framework v3.5,而这个是v4.0