更改TimeZone不反映.NET Compact Framework中的时间更改

时间:2011-08-31 04:38:52

标签: c# .net compact-framework windows-ce

我正在开发.Net Compact Frmework(CF)应用程序。我这个应用程序的要求是我应该能够更改TimeZone。但是,当我更改TimeZone时,当前时间不会更改为特定的TimeZone。从,我开始知道DateTime.Now在这种情况下无法工作。

我正在使用以下Win API:

  1. SetTimeZoneInformation(...) - 在运行时设置时区。
  2. GetLocalTime(...) - 获取当地时间w.r.t当前时间 区。
  3. 有人可以告诉我可能出现的问题吗?

3 个答案:

答案 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。