如何根据实际时间检查用户的系统时间并有条件地更新它?

时间:2012-11-09 15:27:01

标签: c# datetime windows-8 windows-runtime winrt-async

如何根据“实际”时间检查用户的系统时间(简单)(他们的时间可能设置错误),然后通知他们并提供将系统时间更新为实际时间然后这样做?

IOW,伪代码:

DateTime dtSet = DateTime.Now;
DateTime dtActual = GetActualTime();
if (dtSet != dtActual) // allow some delta, such as anything under a 1 minute variance)
{
  if (UserAllowsChange())
  {
    ChangeTheTimeTo(dtActual);
  }
}

也许Noda Time在我的未来。我无法帮助它,但每当我看到这个名字时,我都会想起Don Williams / Eric Clapton的歌。

2 个答案:

答案 0 :(得分:3)

进程必须具有SE_SYSTEMTIME_NAME权限才能设置系统时间。 Windows应用商店应用永远不会拥有此权限。 Windows应用商店应用程序在沙盒中运行,称为应用程序容器,并且它们与系统其他部分的交互方式受到限制。

在具有足够权限的普通桌面应用中,SetSystemTime可用于设置系统时间。

答案 1 :(得分:1)

除了James McNellis的回答...... DateTime.Now使用本地系统时间。您需要连接到网络时间服务器(NTS)才能获得“实际”时间。然后,您可以将NTS的响应解析为DateTime结构,并与DateTime.Now进行比较。

如果它们不匹配,您可以使用SetSystemTime(如果您有特权)来设置NTS给出的时间。

请记住,例如说你得到NTS响应,解析它,然后设置系统时间,新的本地系统时间仍然是错误的,因为在获得NTS响应和设置之间经过了一段时间系统时间。

您可能需要考虑使用Timespan或Stopwatch之类的东西来监控获取NTS响应和设置系统时间之间的经过时间。将此添加到NTS响应中应该可以提供更准确的结果。

检查出来(连接到NTS)

http://www.codeproject.com/Articles/17851/Connecting-To-A-Network-Time-Server

http://www.dotnet-snippets.com/dns/c-simple-network-time-ntp-protocol-client-SID571.aspx