互联网上有免费的美国标准时间,即Nist时间,Windows中除微软自己提供的Internet时间外,也支持由Nist提供的多个Internet时间,可见此时间的权威性。
获取Nist的方法非常简单,下面是一个封闭好的获取Nist时间的类:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Sockets;
using System.Text;
namespace Felomeng
{
public class NistTime
{
private static char[] SeparatorArray = new char[] { ' ' };
public DateTime GetNistTime()
{
//string whost = "time.nist.gov";//这个地址响应不如下面IP
//IPHostEntry iphostinfo = Dns.GetHostEntry(whost);
var ipe = new IPEndPoint(IPAddress.Parse("132.163.4.101"), 13);
var c = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)
{ReceiveTimeout = 10*1000}; //创建Socket
c.Connect(ipe);
var recvBuffer = new byte[1024];
int nBytes;
var sb = new StringBuilder();
while ((nBytes = c.Receive(recvBuffer, 0, 1024, SocketFlags.None)) > 0)
{
sb.Append(Encoding.UTF8.GetString(recvBuffer, 0, nBytes));
}
var dt = ParseDateTimeFromString(sb.ToString());
c.Close();
return dt;
}
private static DateTime ParseDateTimeFromString(string daytimeString)
{
daytimeString = daytimeString.Replace("\n", string.Empty)
.Replace("\0", string.Empty);
// 54708 08-08-30 18:53:02 50 0 0 770.8 UTC(NIST) *
// 0 1 2 3 4 5 6 7 8
// http://tf.nist.gov/service/its.htm
// See "Daytime Protocol (RFC-867)"
string[] resultTokens = daytimeString.Split(SeparatorArray, StringSplitOptions.RemoveEmptyEntries);
if (resultTokens[7] != "UTC(NIST)" || resultTokens[8] != "*")
{
throw new Exception(string.Format("Invalid RFC-867 daytime protocol string: '{0}'", daytimeString));
}
var mjd = int.Parse(resultTokens[0]); // "JJJJ is the Modified Julian Date (MJD). The MJD has a starting point of midnight on November 17, 1858."
var now = new DateTime(1858, 11, 17);
now = now.AddDays(mjd);
var timeTokens = resultTokens[2].Split(':');
var hours = int.Parse(timeTokens[0]);
var minutes = int.Parse(timeTokens[1]);
var seconds = int.Parse(timeTokens[2]);
var millis = double.Parse(resultTokens[6], new System.Globalization.CultureInfo("en-US")); // this is speculative: official documentation seems out of date!
now = now.AddHours(hours);
now = now.AddMinutes(minutes);
now = now.AddSeconds(seconds);
now = now.AddMilliseconds(-millis);
return now;
}
}
}
有了这个类,想获取Internet时间就容易了,下面是一个按钮事件中获取Internet的实例,最终把Internet时间的值赋给了该按钮的Text属性,即按钮上显示获取的时间:
private void button2_Click(object sender, EventArgs e)
{
Felomeng.NistTime clock = new Felomeng.NistTime();
this.button2.Text = clock.GetNistTime().ToLocalTime().ToString();
}
获取NIST时间的实现与应用

本文介绍了一个用于获取美国国家时间标准(NIST时间)的类实现,包括通过Socket连接获取NIST时间服务器数据,并解析响应字符串以获取精确时间。通过一个按钮事件实例演示了如何将获取到的时间值显示在界面上。
1089

被折叠的 条评论
为什么被折叠?



