如何获得外部服务器的时间(包括毫秒或(1/100秒))?

时间:2013-03-01 10:51:01

标签: c# time

我正试图让服务器外出时间。

首先,我试过了:

string URL = "http://google.com"; 
System.Net.HttpWebRequest rq2 = (System.Net.HttpWebRequest)System.Net.WebRequest.Create(URL);
System.Net.HttpWebResponse res2 = (System.Net.HttpWebResponse)rq2.GetResponse();
DateTime xd = rq2.Date;

但这很慢,并且不包含毫秒。

然后我发现,我实际上可以从目标服务器使用的ntp服务器获得服务器的时间。

 InternetTime.SNTPClient sntp = new InternetTime.SNTPClient("time-b.timefreq.bldrdoc.gov");
 sntp.Connect(false); // true to update local client clock
 DateTime dt = sntp.DestinationTimestamp.AddMilliseconds(sntp.LocalClockOffset);
 string timeStampNow = dt.ToString("dd/MM/yyyy HH:mm:ss.fff");

它工作得很好,但是,我不确定我的目标服务器是否使用ntp服务器,如果确实如此,我不知道如何找到它。我花了很多时间研究,所以我决定在这里问。

edit2:我没有任何访问该服务器的权限(除了访问它的www页面),我知道,服务器正在使用 Microsoft-IIS / 7.5 Web服务器

1 个答案:

答案 0 :(得分:2)

没有办法可靠地获得随机HTTP服务器的时间,其分辨率高于它在响应头中返回的分辨率。正如您所发现的那样,只有几秒才准确。它不是当前时间,而是服务器填充标题的时间。您不知道是否是请求进入的时间,响应发送的时间,或者可能是一些愚蠢的程序员填入标题的随机时间,只是为了让您的生活变得困难。你只能说,“这是服务器报告的时间。”

即使您知道有问题的服务器从哪个NTP服务器获取时间,并假设您可以访问该服务器,从中获取时间也不会为您提供服务器时间的准确值。服务器定期通过NTP更新其时钟,但这可能是每天,每周,每月或“管理员决定时”。 NTP服务器的时间不会准确反映特定服务器的时间。在一般情况下,当然不在毫秒范围内。如果服务器在一段时间内没有将其时钟与NTP服务器同步,那么甚至可能在几分钟之内。

顺便说一句,如果您要查找的只是服务器返回的时间,那么您可能应该尽可能地执行HEAD请求。但是你也必须支持执行GET请求,因为许多服务器将返回405错误以响应HEAD请求。