在Windows Mobile 6上使用Compact Framework设置时区

5
首先,背景:我有一个在Windows Mobile 6设备(IPAQ 210s)上以kiosk模式运行的.Net应用程序。我们的软件实际上独立于操作系统跟踪用户的时区,因此我们根据他们相对于UTC的时区调整计算显示的时间。正如许多人所知,要在Windows Mobile 6上实现真正的kiosk模式并不容易,这个应用程序的最后一块拼图是抑制来自操作系统的DST通知。
我倾向于使用GMT卡萨布兰卡作为设备时区的设置方法,因为它不遵循夏令时。然而,我已经发现,尽管我尽了最大的努力(包括使用OpenNETCF库),但在设备配置过程中不能可靠地保持时区设置。在操作系统中的日期/时间小程序中,时区看起来像是GMT,但时间与该时区应有的时间差了一个小时。
有人可以提供关于如何正确保持时区更改的建议吗?或者更好的办法是,有人知道如何在WinMob 6上禁用DST通知吗?
5个回答

3

由于某种原因,CF实际上在启动时缓存时区信息(我认为完整框架也是如此)。因此,当您更改时区时,CF不知道这些更改。如果使用GetSystem/LocalTime API,则会获得正确的时间,但DateTime.Now将不反映这些更改。

我在2004年报告了这个问题

在桌面上,您可以使用TimezoneInfo.ClearCachedInfo方法,但在CF中不存在该方法。


1
你可以在注册表中进行设置。只需设置 HKLM\Time\TimeZoneInformation 值。 还有一个函数可以被调用:SetTimeZoneInformation

1
注册表键是特定于Windows CE的,我相信。不过,我会尝试使用p/invoke调用。 - bjanaszek
注册表键也适用于Windows Mobile设备。我过去曾经使用过它。但是PInvoke可能是推荐的解决方案。 - Tom van Enckevort

1

我在更改时区时也遇到了 off by one 错误,但是还没有在 CF 中遇到。最终,我决定这是由于将设备的时区从已经处于 DST 的时区更改为不处于 DST 的时区所导致的。它似乎在我们处于标准时间的月份中正确工作,但在夏令时时失败了。非常烦人。

最后,我最终设置了两次时区和时间。第二次(通常)是正确的。


0

我在Windows Mobile 5中遇到了同样的一个DST错误,这个问题似乎与.NET无关,而是与操作系统有关。因为我在设备上使用了SetSystemTime API调用,传递了服务器的DateTime.UtcNow值(始终准确,从未差一个小时)。由于我们决定将所有设备设置为与服务器相同的时区,所以我无法进一步追踪该问题。只有当在设备上设置系统时间时,该错误才会发生,而该设备的时区与服务器不同时。

尽管进行了广泛的搜索,但我从未在任何地方看到过此问题的报告,这意味着以下其中之一是真实的:

  1. 大多数WinMo设备用户手动设置自己的时间和时区,因此这个问题从未出现过
  2. 该问题是特定于构建而非普遍适用于操作系统的(我遇到的问题是在iPAQ上,但我不记得是否尝试在其他设备上重现该问题)
  3. 我临床疯狂,这从未发生过

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接