如何通过SNTP查询本地网络当前日期时间?

时间:2014-02-12 20:59:38

标签: c# datetime

我们正准备推出其中一款新产品的测试版,由于我们尚未投入许可组件,我们决定只投入定时炸弹,因此测试版无效在某个约会之后。显然,我们不想只信任系统时间,因为这很容易回滚。

我们已经对互联网上的几个不同的NTP服务器进行了检查,并对一些主要网站的HTTP响应标题中的时间进行了一些检查,但我们的软件旨在用于一个并非闻所未闻的行业。拥有一个无法访问Internet的安全本地网络。因此,我们认为通过SNTP(或NTP,如果这更容易)从本地网络的时间服务器(如果有的话)获取日期会很好。

我们只需要一个简单的查询,我在网上看到的所有C#SNTP示例都是功能齐全的客户端,能够使计算机的系统时间保持同步,并在您要配置的任何层中充当本地NTP服务器他们为我们的需要完全矫枉过正。

任何人都可以解释如何进行这样的广播查询吗?我们的NTP查询代码需要一个特定的地址才能连接,显然我们不会知道客户的本地网络。

1 个答案:

答案 0 :(得分:0)

记得这个问题,我想发布了我发现的解决方案:

var cmd = new System.Diagnostics.Process
{
    StartInfo =
    {
        FileName = "cmd.exe",
        WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden,
        RedirectStandardOutput = true,
        Arguments = "/C net time /DOMAIN:" + Environment.UserDomainName,
        UseShellExecute = false
    }
};

cmd.Start();

string output = cmd.StandardOutput.ReadToEnd();
if (output.EndsWith("The command completed successfully.\r\n\r\n"))
{
    int is_index = output.IndexOf("is ");
    int serv_start = output.IndexOf(@"\\") + 2;
    int serv_end = is_index - 1;
    string time_server = output.Substring(serv_start, serv_end - serv_start).Split(new char[] { '.' })[0];
    if (time_server == Environment.MachineName)
        return DateTime.MaxValue; // local machine is acting as time server

    int time_start = is_index + 3;
    int time_end = output.IndexOf("\r");
    string local = output.Substring(time_start, time_end - time_start);
    return DateTime.ParseExact(local, "M/d/yyyy h:mm:ss tt", System.Globalization.CultureInfo.InvariantCulture);
}

return DateTime.MaxValue;

这从域的时间服务器获取当前时间;如果命令失败或本地计算机是时间服务器,它将返回DateTime.MaxValue(如果您信任系统时间,为什么要检查本地网络?)。为简洁起见,省略了异常处理。

调查了net time用于格式化其输出的文化,因此可能需要使用InvariantCulture之外的其他内容。