在.net紧凑框架中,改变时区并不能反映时间的变化

本文关键字:并不能 时间 变化 时区 改变 net 框架 | 更新日期: 2023-09-27 18:07:01

我正在开发。net Compact framework (CF)应用程序。在这个应用程序中,需求是我应该能够更改TimeZone。但是,当我更改TimeZone时,当前时间不会更改为该特定的TimeZone。从网上我知道了DateTime。现在无法在这种情况下工作

我正在使用以下Win API:

  1. SetTimeZoneInformation(...) -在运行时设置时区。
  2. GetLocalTime(...) -获取本地时间w.r.t当前时间区。

谁能告诉我可能出了什么问题?

在.net紧凑框架中,改变时区并不能反映时间的变化

以这种方式更改应用程序的时区并不会更改本地时间:相反,它会更改系统时间以保持本地时间不变。这不是控制面板所做的,但如果你想模仿控制面板的功能,你需要这样做:

  • 保存系统时间
  • 更改时区
  • 恢复保存的系统时间

这样系统时间保持不变,而本地时间根据所选择的时区变化。

顺便说一下,我们使用OpenNETCF库(http://www.opennetcf.com)在我们的一个产品中做到了这一点,其中包括一个DateTimeHelper类(以及许多其他有用的东西-社区版是免费的)。(这只是比编写自己的pinvoke来访问SetTimeZoneInformation()简洁一点,功能是一样的。)

这是经过设计的,它避免了依赖于稳定增加的时钟的代码遭受心脏病发作。解决方法是在更改时区后显式调用CultureInfo.CurrentCulture.ClearCachedData()。或者重新启动应用。

我有同样的问题。在我的例子中,要更改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时区。例如11/7/2012 14:00 +02:00

使用此代码后,我有GMT+1与相同的时间。2012年7月11日14:00 +01:00