我正在开发.Net Compact Frmework(CF)应用程序。我这个应用程序的要求是我应该能够更改TimeZone。但是,当我更改TimeZone时,当前时间不会更改为特定的TimeZone。从,我开始知道DateTime.Now在这种情况下无法工作。
我正在使用以下Win API:
SetTimeZoneInformation(...)
- 在运行时设置时区。GetLocalTime(...)
- 获取当地时间w.r.t当前时间
区。有人可以告诉我可能出现的问题吗?
答案 0 :(得分:5)
以这种方式更改应用程序的时区不更改本地时间:而是更改系统时间以保持本地时间相同。这不是控制面板的功能,但如果您想模拟控制面板功能,则需要执行以下操作:
这样,系统时间保持不变,本地时间根据所选时区而变化。
顺便说一下,我们使用OpenNETCF库(http://www.opennetcf.com)在我们的产品中执行此操作,其中包括DateTimeHelper
类(在许多其他有用的东西中 - 社区版是免费的) 。 (这比编写自己的pinvoke访问SetTimeZoneInformation()
要简单一些,功能相同。)
答案 1 :(得分:3)
这是设计上的,它避免了依赖于心脏病发作的稳定增长时钟的代码。解决方法是在更改时区后显式调用CultureInfo.CurrentCulture.ClearCachedData()。或者重新启动应用程序。
答案 2 :(得分:3)
我有同样的问题。在我的情况下,在不改变时间的情况下更改TimeZone,我使用了以下代码:
DateTime dateTime = DateTime.Now;
TimeZoneInfo timeZone = TimeZoneInfo.FindSystemTimeZoneById("Central European Standard Time");
TimeSpan currentOffset = timeZone.BaseUtcOffset.Duration();
DateTimeOffset offset = new DateTimeOffset(dateTime, currentOffset);
我有GMT + 2 TimeZone。例如11/7/2012 14:00 +02:00。
使用此代码后,我同时使用GMT + 1。 11/7/2012 14:00 +01:00。