如何以编程方式更改系统时区

时间:2013-11-28 16:00:46

标签: c# .net timezone

我正在努力从WPF应用程序中更改系统时区。要做到这一点,我使用的是我在本网站上找到的非托管代码:changing time zones。它确实改变了我的时区。但是,当我点击Windows时钟时,我会看到一条消息:“您当前的时区无法识别。请使用下面的链接选择一个有效的时区。”我可以想象某处有一点点差异。我已经分析了一个时区 - 在程序化改变之前以及之后如何表示。

在:

BaseUtcOffset: 4:00:00:00
Daylight Name: "Arabian Daylight Time"
Display Name: "(UTC +4:00) Abu Dhabi, Muscat"
Id: "Arabian Daylight Time"
Standard Name: "Arabian Daylight Time"
SupportsDaylightSavingTime: false

在:

BaseUtcOffset: -4:00:00:00
Daylight Name: ""
Display Name: "Arabian Daylight Time"
Id: "Arabian Daylight Time"
Standard Name: "Arabian Daylight Time"
SupportsDaylightSavingTime: false

我发现无法使用TIME_ZONE_INFORMATION设置“显示名称”。因此,当用户手动使用Windows设置进行更改时,在GUI上称为“(UTC +4:00)阿布扎比,马斯喀特”的东西,现在被称为“阿拉伯日光时间”。也许这些差异是我看到“您当前的时区......”消息的原因之一。我已经阅读了其他地方重启帮助,这条消息消失了 - 不幸的是,重启后没有任何变化。

1 个答案:

答案 0 :(得分:1)

好。我发现了自己的错误。问题是在Windows 7上我试图用以下方式更改时区:

[DllImport("kernel32.dll", CharSet = CharSet.Auto)]   
private static extern bool SetTimeZoneInformation([In] ref TimeZoneInformation lpTimeZoneInformation);

虽然我应该使用:

[DllImport("kernel32.dll", CharSet = CharSet.Auto)]
private static extern bool SetDynamicTimeZoneInformation([In] ref DynamicTimeZoneInformation lpTimeZoneInformation);

使用DYNAMIC_TIME_ZONE_INFORMATION解决了当前任务的大部分问题。