C# 實現獲取網路時間
阿新 • • 發佈:2018-12-17
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 server const 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 values ntpData[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 123 IPEndPoint ipEndPoint = new IPEndPoint(addresses[0], 123); // NTP uses UDP Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); socket.Connect(ipEndPoint); // Stops code hang if NTP is blocked socket.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 part ulong intPart = BitConverter.ToUInt32(ntpData, serverReplyTime); // Get the seconds fraction ulong fractPart = BitConverter.ToUInt32(ntpData, serverReplyTime + 4); // Convert From big-endian to little-endian intPart = swapEndian(intPart); fractPart = swapEndian(fractPart); ulong milliseconds = (intPart * 1000) + ((fractPart * 1000) / 0x100000000UL); // UTC time DateTime webTime = (new DateTime(1900, 1, 1, 0, 0, 0, DateTimeKind.Utc)).AddMilliseconds(milliseconds); // Local time return 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 GMTv public 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; } } #endregion private 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; } } } } }