【问题标题】:Unable to set time on Win CE device无法在 Win CE 设备上设置时间
【发布时间】:2013-03-01 16:00:37
【问题描述】:

我创建了一个软件,其中时间非常重要。因此,每次传输一些数据时,我都会在 win ce 设备上设置时间。我通过套接字 DateTime.Now.Ticks 传输并使用

设置时间

[DllImport("coredll.dll")] 私有外部静态 uint SetSystemTime(ref SYSTEMTIME lpSystemTime);

时区在 PC 上正确设置为 GMT+1,其中服务器应用程序正在运行,并且也在设备上。设备上的 HomeDST 为 0。

我的问题是,操作系统中的时间和我的软件中的时间总是有一个小时的差异。我使用

检索时间

[DllImport("coredll.dll")] 私有外部静态无效 GetSystemTime(ref SYSTEMTIME lpSystemTime);

例如,在设备的右上角,我看到的是 9:12,而不是应用程序中的 8:12。

有人对此有解释/解决方案吗?这将非常有帮助,因为不幸的是,该应用程序已经在实时系统中使用,而这会带来很大的问题......

【问题讨论】:

    标签: c# time windows-ce


    【解决方案1】:

    SetSystemTime 采用 UTC 时间(请参阅http://msdn.microsoft.com/en-gb/library/windows/desktop/ms724942(v=vs.85).aspx

    因此,如果您从服务器获取时间为 +1,则应在将其传递给 SetSystemTime() 之前对其调用 .ToUniversalTime()。

    作为一般规则,为了让您的生活更简单,我建议您将所有时间都保持为 UTC,除了在 UI 中显示时 - 这是将它们转换为本地时间的时间。

    【讨论】:

    • 而GetSystemTime 也将它检索为UTC,所以我有一个问题......所以我只需要按时区调整它,就可以了。谢谢!
    • 对不起,我取消了答案,因为问题仍然存在......即使我使用 UTC 时间并设置它,而不是使用 GetSystemTime 检索,我也少了一个小时。这两个函数都应该使用 UTC 时间,但我从 GetSystemTime 得到不同的时间,因为它是由 SetSystem 时间设置的。在第二次调用 SetSystemTime 时,有时会再次正确。
    • 必须更正一下。从我的角度来看,这完全是一团糟。在执行 SetSystemTime 后,我立即使用 GetSystemTime 获得相同的 UTC 时间,但几秒钟后,GetSystemTime 调用的结果发生了变化,并且它减少了一个小时。
    • 如果您在 UI 中向上拉系统时间控制面板小部件,您是否看到它自发跳了一个小时?您是否正在通过 activesync/similar 进行调试,它可能会从您的 PC 中获取时间?是否可以使用 NTP 从某个地方的网络获取时间?
    • Activesync 在这里不起作用(不再起作用),我看到 ActiveSync 也在同步时间,所以我通过 wifi+socket 进行了测试。但是 NTP 是个好主意,我会尝试将其关闭。
    【解决方案2】:

    您使用夏令时吗?如果您确实尝试禁用它并查看问题是否仍然存在。我遇到了一个问题,在使用 SetSystemTime() 和 SetLocalTime() 设置系统时间后,时钟可能会出错几个小时。

    事实证明,设备制造商没有在驱动程序中正确实施 DST,因为实时时钟只能处理本地时间。至少这是他们的解释。关闭 DST 解决了我的问题,除了您必须每年手动调整时钟两次以实现夏令时。

    【讨论】:

    • 您能帮我在哪里以编程方式关闭夏令时吗?我什至没有在 UI 上的设备上找到它。
    • 找到注册表项 [HKEY_LOCAL_MACHINE\Software\Microsoft\Clock] 并将 AutoDST 值更改为 0。您可能需要在刷新注册表后重新启动设备。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-06
    • 2012-03-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多