C# SetDynamicTimeZoneInformation应该如何处理偏差
我有一段代码试图在Windows(Embedded 7)上禁用夏令时,但我认为这是一种奇怪的方式。不幸的是,代码是由已经离开很久的其他人编写的,我不知道他们想做什么C# SetDynamicTimeZoneInformation应该如何处理偏差,c#,.net,timezone,dst,C#,.net,Timezone,Dst,我有一段代码试图在Windows(Embedded 7)上禁用夏令时,但我认为这是一种奇怪的方式。不幸的是,代码是由已经离开很久的其他人编写的,我不知道他们想做什么 DynamicTimeZoneInformation timeZoneInfo; GetDynamicTimeZoneInformation(out timeZoneInfo); timeZoneInfo.DisableDynamicDaylightTime(); /
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时间添加偏移量来将时钟更改回本地时区,但这并不是我真正的问题所在
我的问题是。比方说,我将时区(通过Windows)设置为巴格达,即UTC+3:00。现在是11点。当我得到时区信息时,它的偏差
为-180,而标准偏差
为-60。上面的代码将两个偏差都设置为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。这类问题将受益于一项新的研究。上面的代码不完整或不可验证。你能修改一下你的问题吗?我可以猜到您以前的开发人员可能在想什么,但一般来说,看到与DynamicTimeZoneInformation
(来自Win32 API)相关的函数与您的.NET代码混合在一起是非常奇怪的。你应该确保在你的MCVE中包含你的PInvoke调用。同样,重新评估这段代码首先要实现的目标可能是一个更好的计划。也许有一种更好的方法不需要改变系统时区。根据单个应用程序的需要更改系统范围的设置是一项相当棘手的工作。你能想象如果多个应用程序试图同时改变系统时区吗?!另外,请注意,TimeZoneInfo.ClearCachedData
仅从.NET组件内部保存的静态变量中清除.NET读取的系统时区。这会影响诸如TimeZoneInfo.Local
和DateTime.Now
之类的内容。它根本不会影响系统时间或系统时区设置,也不会影响DateTime.UtcNow
。因此,当你说“它将UTC时间设置为05:00”时,它不能。@MattJohnson-我将尝试提出一个MCVE-但是我必须说TimeZoneInfo.ClearCachedData()
正在更改DateTimeOffset.Now.UtcDateTime
。不确定这是否会改变您的上述陈述,但我将编辑我的问题以反映。这与DateTime.UtcNow
相同,只是进行了两次额外的转换。