C# 获取Internet时间
来源:互联网 发布:淘宝开店一个月没生意 编辑:程序博客网 时间:2024/05/01 16:16
互联网上有免费的美国标准时间,即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();
}
- C# 获取Internet时间
- (转)C#获取Internet服务器的时间
- c# Internet时间服务器同步
- c# Internet时间服务器同步
- 从Internet时间服务器获取标准格林尼治时间
- C# 获取时间实例
- C# 获取时间
- C#获取系统时间
- C#获取系统时间
- C# 获取季度时间
- C#获取时间
- C#获取百度时间
- c#获取当前时间
- C# 获取DateTime时间
- c# 获取微妙时间
- C#获取当前时间
- c#获取当前时间
- C# 获取时间戳
- Android MENU加载方法
- memcpy和strcpy的区别
- Android Canvas 保存为图片
- 一个计算机爱好者的不完整回忆外传——网上的MM们(二)
- uva 846 - Steps
- C# 获取Internet时间
- 客户端调用服务器端代码的方式(非entity、facade方式)
- ctype.h字符处理函数
- waves5.0插件在win7 64bit上的安装使用问题
- 一个计算机爱好者的不完整回忆外传——网上的MM们(三)
- 后台调用编码规则
- 71道经典Android面试题和答案--重要知识点都涉及到了
- Apache进程池模型
- Android 的启动流程