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

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

问题描述:

我试图让服务器在外面的时间。如何获取服务器的时间(包括毫秒或(1/100秒))?

首先,我试过了:

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页面),我知道,服务器正在使用微软IIS/7.5网络服务器

+0

究竟是什么意思?当你得到它的时候将会(有点)陈旧。 – 2013-03-01 19:17:32

+0

嗯,我可以计算延迟,所以我有时间类似于原始 – Patryk 2013-03-01 19:22:41

+0

不,你不能计算延迟。因为在请求处理期间您不知道何时检索到时间值。即使你这样做了,你也无法可靠地确定服务器的响应需要多长时间。 – 2013-03-01 19:33:32

没有办法可靠地获得一个随机HTTP服务器的时间,分辨率比它在响应头中返回的时间多。就像你发现的那样,它只能精确到秒。这不是当前时间,而是服务器填充标题的时间。你不知道请求是在什么时候发送的,响应被发送的时间,还是可能是一些随机的时间,一些愚蠢的程序员塞进标头只是为了让你的生活变得困难。你只能说,“这是服务器报告的时间。”

即使您知道有问题的服务器从中获得NTP服务器的时间,并假设您可以访问该服务器,但从中获取时间并不会为您提供服务器时间的准确值。服务器定期通过NTP更新他们的时钟,但这可能是每日,每周,每月或“每当管理员决定”时。 NTP服务器的时间不会准确地反映特定服务器的时间。当然,在一般情况下,不在毫秒范围内。如果服务器在一段时间内没有将时钟与NTP服务器同步,甚至可能在几分钟内不会。顺便说一下,如果你只是在寻找服务器返回的时间,那么你应该尽可能地做一个HEAD请求。但是你也必须支持GET请求,因为许多服务器将响应HEAD请求返回405错误。

+0

日期 - \t邮件发送的日期和时间(http://en.wikipedia.org/wiki/List_of_HTTP_header_fields) - 这不是清楚地告诉我,服务器什么时候返回? – Patryk 2013-03-01 19:39:38

+0

但是“什么时候发送消息”是什么意思?字节到达导线的确切时刻?你是否认为在检索当前日期和时间的代码之间可能会有一些(小的,但是可测量的)时间段,并且实际上将字节放在线上? – 2013-03-01 20:18:09