C# 实现获取网络时间
生活随笔
收集整理的這篇文章主要介紹了
C# 实现获取网络时间
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
C# Winform獲取網絡時間,同時顯示本地時間,支持毫秒顯示
直接上圖
工具下載
代碼
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms;using System.Diagnostics; using System.Net; using System.Net.Sockets;using System.Runtime; using System.Runtime.InteropServices; using System.Drawing.Drawing2D;namespace WindowsFormsTimer {public partial class Form1 : Form{Point CPoint;//獲取控件中鼠標的坐標int Frm_Height = 0;int FrmHeight = 0;static int Tem_place = 0;public Form1(){InitializeComponent();}private void Form1_Load(object sender, EventArgs e){timer.Start();Frm_Height = this.Height;FrmHeight = this.Height;button_Click(null, null);}// 小端存儲與大端存儲的轉換private uint swapEndian(ulong x){return (uint)(((x & 0x000000ff) << 24) +((x & 0x0000ff00) << 8) +((x & 0x00ff0000) >> 8) +((x & 0xff000000) >> 24));}// 方法1、獲取NTP網絡時間public DateTime getWebTime(){// default ntp serverconst string ntpServer = "ntp1.aliyun.com";// NTP message size - 16 bytes of the digest (RFC 2030)byte[] ntpData = new byte[48];// Setting the Leap Indicator, Version Number and Mode valuesntpData[0] = 0x1B; // LI = 0 (no warning), VN = 3 (IPv4 only), Mode = 3 (Client Mode)IPAddress[] addresses = Dns.GetHostEntry(ntpServer).AddressList;foreach (var item in addresses){Debug.WriteLine("IP:"+ item); }// The UDP port number assigned to NTP is 123IPEndPoint ipEndPoint = new IPEndPoint(addresses[0], 123);// NTP uses UDPSocket socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);socket.Connect(ipEndPoint);// Stops code hang if NTP is blockedsocket.ReceiveTimeout = 3000;socket.Send(ntpData);socket.Receive(ntpData);socket.Close();// Offset to get to the "Transmit Timestamp" field (time at which the reply // departed the server for the client, in 64-bit timestamp format."const byte serverReplyTime = 40;// Get the seconds partulong intPart = BitConverter.ToUInt32(ntpData, serverReplyTime);// Get the seconds fractionulong fractPart = BitConverter.ToUInt32(ntpData, serverReplyTime + 4);// Convert From big-endian to little-endianintPart = swapEndian(intPart);fractPart = swapEndian(fractPart);ulong milliseconds = (intPart * 1000) + ((fractPart * 1000) / 0x100000000UL);// UTC timeDateTime webTime = (new DateTime(1900, 1, 1, 0, 0, 0, DateTimeKind.Utc)).AddMilliseconds(milliseconds);// Local timereturn webTime.ToLocalTime();}//方法2、獲取ntp時間public static DateTime DataStandardTime()//使用時,將static 關鍵字刪除,在其它位置方可使用?2010-11-24{//返回國際標準時間//只使用的TimerServer的IP地址,未使用域名string[,] TimerServer = new string[14, 2];int[] ServerTab = new int[] { 3, 2, 4, 8, 9, 6, 11, 5, 10, 0, 1, 7, 12 };TimerServer[0, 0] = "time-a.nist.gov";TimerServer[0, 1] = "129.6.15.28";TimerServer[1, 0] = "time-b.nist.gov";TimerServer[1, 1] = "129.6.15.29";TimerServer[2, 0] = "time-a.timefreq.bldrdoc.gov";TimerServer[2, 1] = "132.163.4.101";TimerServer[3, 0] = "time-b.timefreq.bldrdoc.gov";TimerServer[3, 1] = "132.163.4.102";TimerServer[4, 0] = "time-c.timefreq.bldrdoc.gov";TimerServer[4, 1] = "132.163.4.103";TimerServer[5, 0] = "utcnist.colorado.edu";TimerServer[5, 1] = "128.138.140.44";TimerServer[6, 0] = "time.nist.gov";TimerServer[6, 1] = "192.43.244.18";TimerServer[7, 0] = "time-nw.nist.gov";TimerServer[7, 1] = "131.107.1.10";TimerServer[8, 0] = "nist1.symmetricom.com";TimerServer[8, 1] = "69.25.96.13";TimerServer[9, 0] = "nist1-dc.glassey.com";TimerServer[9, 1] = "216.200.93.8";TimerServer[10, 0] = "nist1-ny.glassey.com";TimerServer[10, 1] = "208.184.49.9";TimerServer[11, 0] = "nist1-sj.glassey.com";TimerServer[11, 1] = "207.126.98.204";TimerServer[12, 0] = "nist1.aol-ca.truetime.com";TimerServer[12, 1] = "207.200.81.113";TimerServer[13, 0] = "nist1.aol-va.truetime.com";TimerServer[13, 1] = "64.236.96.53";int portNum = 13;string hostName;byte[] bytes = new byte[1024];int bytesRead = 0;System.Net.Sockets.TcpClient client = new System.Net.Sockets.TcpClient();for (int i = 0; i < 13; i++){hostName = TimerServer[ServerTab[i], 0];Debug.WriteLine("hostName:"+hostName);try{client.Connect(hostName, portNum);System.Net.Sockets.NetworkStream ns = client.GetStream();bytesRead = ns.Read(bytes, 0, bytes.Length);client.Close();break;}catch (System.Exception){Debug.WriteLine("錯誤!");}}char[] sp = new char[1];sp[0] = ' ';System.DateTime dt = new DateTime();string str1;str1 = System.Text.Encoding.ASCII.GetString(bytes, 0, bytesRead);Debug.WriteLine("ntp time:"+str1);string[] s;s = str1.Split(sp);dt = System.DateTime.Parse(s[1] + " " + s[2]);//得到標準時間Debug.WriteLine("get:"+dt.ToShortTimeString());//dt=dt.AddHours (8);//得到北京時間*/return dt;}//方法3、獲取網頁時間//Bdpagetype:2//Bdqid:0xaff4e50f00011b53//Cache-Control:private//Connection:Keep-Alive//Content-Encoding:gzip//Content-Type:text/html;charset=utf-8//Date:Tue, 23 Oct 2018 03:24:38 GMTvpublic static string GetNetDateTime(){WebRequest request = null;WebResponse response = null;WebHeaderCollection headerCollection = null;string datetime = string.Empty;try{request = WebRequest.Create("https://www.baidu.com");request.Timeout = 1000;request.Credentials = CredentialCache.DefaultCredentials;response = (WebResponse)request.GetResponse();headerCollection = response.Headers;foreach (var h in headerCollection.AllKeys){ if (h == "Date") { datetime = headerCollection[h]; } }return datetime;}catch (Exception) { return datetime; }finally{if (request != null){ request.Abort(); }if (response != null){ response.Close(); }if (headerCollection != null){ headerCollection.Clear(); }}}private void timer_tick(object sender, EventArgs e){// Debug.WriteLine("1s");label_date.Text = DateTime.Now.ToString("F")+" "+DateTime.Now.ToString("fff");label_dateNet.Text = DateTime.Now.ToString("F"); // +" " + DateTime.Now.ToString("fff");}private void formClosed(object sender, FormClosedEventArgs e){timer.Stop();timer1.Stop();}private void button_Click(object sender, EventArgs e){DateTime dt = getWebTime();SetDate(dt);string str = dt.ToString("F");// +" " + dt.ToString("fff");Debug.WriteLine(str);label_dateNet.Text = str;}private struct SYSTEMTIME{public short year;public short month;public short dayOfWeek;public short day;public short hour;public short minute;public short second;public short milliseconds;}[DllImport("kernel32.dll")]private static extern bool SetLocalTime(ref SYSTEMTIME time);/// <summary>/// 設置系統時間/// </summary>/// <param name="dt">需要設置的時間</param>/// <returns>返回系統時間設置狀態,true為成功,false為失敗</returns>public static bool SetDate(DateTime dt){SYSTEMTIME st;st.year = (short)dt.Year;st.month = (short)dt.Month;st.dayOfWeek = (short)dt.DayOfWeek;st.day = (short)dt.Day;st.hour = (short)dt.Hour;st.minute = (short)dt.Minute;st.second = (short)dt.Second;st.milliseconds = (short)dt.Millisecond;bool rt = SetLocalTime(ref st);return rt;}private void checkBoxClick(object sender, EventArgs e){Debug.WriteLine("自動"+checkBox1.Checked);if (checkBox1.Checked == true){timer1.Start();button1.Enabled = false;}else{timer1.Stop();button1.Enabled = true;}}private void timer1_tick(object sender, EventArgs e){Debug.WriteLine("自動更新");button_Click(null,null);}#region 利用窗體上的控件移動窗體/// <summary>/// 利用控件移動窗體/// </summary>/// <param Frm="Form">窗體</param>/// <param e="MouseEventArgs">控件的移動事件</param>public void FrmMove(Form Frm, MouseEventArgs e) //Form或MouseEventArgs添加命名空間using System.Windows.Forms;{if (e.Button == MouseButtons.Left){Point myPosittion = Control.MousePosition;//獲取當前鼠標的屏幕坐標myPosittion.Offset(CPoint.X, CPoint.Y);//重載當前鼠標的位置Frm.DesktopLocation = myPosittion;//設置當前窗體在屏幕上的位置Tem_place = 0;this.Height = FrmHeight;}}#endregionprivate void panelMouseDown(object sender, MouseEventArgs e){CPoint = new Point(-e.X, -e.Y);Debug.WriteLine("mouse down:" + -e.X + " " + -e.Y);}private void panelMouseMove(object sender, MouseEventArgs e){FrmMove(this, e);}private void mouseMove(object sender, MouseEventArgs e){Debug.WriteLine(sender.ToString() +"mouse move:");PictureBox pictureBox = (PictureBox)sender;if (pictureBox.Name == "pictureBoxClose"){pictureBoxClose.BackgroundImage = global::WindowsFormsTimer.Properties.Resources.close_32px_leave;}}private void mouseLeave(object sender, EventArgs e){PictureBox pictureBox = (PictureBox)sender;if (pictureBox.Name == "pictureBoxClose"){pictureBoxClose.BackgroundImage = global::WindowsFormsTimer.Properties.Resources.close_32px;}}private void pictureBox_Click(object sender, EventArgs e){PictureBox pictureBox = (PictureBox)sender;if (pictureBox.Name == "pictureBoxClose"){//this.Close(); //只是關閉當前窗口,若不是主窗體的話,是無法退出程序的,另外若有托管線程(非主線程),也無法干凈地退出;\Application.Exit(); //強制所有消息中止,退出所有的窗體,但是若有托管線程(非主線程),也無法干凈地退出;//Application.ExitThread(); //強制中止調用線程上的所有消息,同樣面臨其它線程無法正確退出的問題;//System.Environment.Exit(0); //這是最徹底的退出方式,不管什么線程都被強制退出,把程序結束的很干凈。 強烈推薦}else if (pictureBox.Name == "pictureBoxLock"){this.TopMost = !this.TopMost;if (this.TopMost == true){pictureBoxLock.BackgroundImage = global::WindowsFormsTimer.Properties.Resources.lock_32px;}else{pictureBoxLock.BackgroundImage = global::WindowsFormsTimer.Properties.Resources.unlock_32px;}}}} }總結
以上是生活随笔為你收集整理的C# 实现获取网络时间的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 专利号校验码php,电子专利证书的三种下
- 下一篇: C#—获取网络时间