YH中多方法获取网络时间

在做YH维护的时候,偶尔会碰到这样的问题:电脑的非正常关机导致系统时间出错(变为了2002-1-1),从而影响到项目系统的使用。尤其是设计到money的系统,如果时间错误,可能会导致无法想象的后果。所以我们可能需要用系统和网络的双重验证。

通过收集、修改、优化和测试,剔除了一些错误的和速度超慢的,只剩下了4种可行的方案。这些方案中主要有3类:

一、通过向某网站发送请求,获取服务器响应请求的时间

二、获某时间网页的html或xml码,读取其中的时间。

三、通过向某授时服务器发送请求,获取网络时间

我把这些方法封装到了一个类库里了。

下面是具体的类:NetTime类(包含了多种获取网络时间的方法,标有速度),需要添加引用:COM-Microsoft Xml 3.0

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using MSXML2;
using System.IO;
using System.Net;
using System.Net.Sockets;
using System.Text.RegularExpressions;
using System.IO.Compression;
using System.Xml;

namespace WebTime
{
    /// <summary>
    /// 网络时间
    /// </summary>
    public class NetTime
    {
        #region 获取标准北京时间1 速度100ms
        /// <summary>
        /// [1].获取标准北京时间1,读取http://www.beijing-time.org/time.asp
        /// </summary>
        /// <returns></returns>
        public  DateTime GetBeijingTime()
        {
            #region  格式
            // t0=new Date().getTime(); nyear=2012; nmonth=2; nday=11;
            // nwday=6; nhrs=0; nmin=23; nsec=0;
            #endregion
            DateTime dt;
            WebRequest wrt = null;
            WebResponse wrp = null;
            try
            {
                wrt = WebRequest.Create("http://www.beijing-time.org/time.asp");
                wrp = wrt.GetResponse();

                string html = string.Empty;
                using (Stream stream = wrp.GetResponseStream())
                {
                    using (StreamReader sr = new StreamReader(stream, Encoding.UTF8))
                    {
                        html = sr.ReadToEnd();
                    }
                }

                string[] tempArray = html.Split(';');
                for (int i = 0; i < tempArray.Length; i++)
                {
                    tempArray[i] = tempArray[i].Replace("\r\n", "");
                }

                string year = tempArray[1].Split('=')[1];
                string month = tempArray[2].Split('=')[1];
                string day = tempArray[3].Split('=')[1];
                string hour = tempArray[5].Split('=')[1];
                string minite = tempArray[6].Split('=')[1];
                string second = tempArray[7].Split('=')[1];
                //for (int i = 0; i < tempArray.Length; i++)
                //{
                //    tempArray[i] = tempArray[i].Replace("\r\n", "");
                //}

                //string year = tempArray[1].Substring(tempArray[1].IndexOf("nyear=") + 6);
                //string month = tempArray[2].Substring(tempArray[2].IndexOf("nmonth=") + 7);
                //string day = tempArray[3].Substring(tempArray[3].IndexOf("nday=") + 5);
                //string hour = tempArray[5].Substring(tempArray[5].IndexOf("nhrs=") + 5);
                //string minite = tempArray[6].Substring(tempArray[6].IndexOf("nmin=") + 5);
                //string second = tempArray[7].Substring(tempArray[7].IndexOf("nsec=") + 5);
                dt = DateTime.Parse(year + "-" + month + "-" + day + " " + hour + ":" + minite + ":" + second);
            }
            catch (WebException)
            {
                return DateTime.Parse("2011-1-1");
            }
            catch (Exception)
            {
                return DateTime.Parse("2011-1-1");
            }
            finally
            {
                if (wrp != null)
                    wrp.Close();
                if (wrt != null)
                    wrt.Abort();
            }
            return dt;
        }
        #endregion

        #region 获取网站响应请求的时间,速度200ms
        /// <summary>
        /// [2]获取网站响应请求的时间,速度200ms
        /// </summary>
        /// <param name="hUrl">网址</param>
        /// <returns>DateTime</returns>
        /// <remarks></remarks>
        public DateTime GetNetTime( string hUrl)
        {
            string datetxt = null;         //请求回应的时间
            string[] date1 = null;         //分割后的星期和日期
            string date2 = "";              //分割后的日期和GMT
            string[] date3 = null;         //最终成型的日期
            DateTime nTime  =DateTime.Today ;
            string localtime = "";
            string mon = "";

            XMLHTTP objHttp = new XMLHTTP();

            objHttp.open("GET", hUrl, false);

            try
            {
                objHttp.send();

                //获取网站回应请求的日期时间。如: Wed, 08 Feb 2012 06:34:58 GMT
                datetxt = objHttp.getResponseHeader("Date");

                //分割时间
                date1 = datetxt.Split(',');

            }
            catch (Exception ex)
            {
                throw ex;
            }

            //
            if (date1 ==null )
            {
                localtime = "网络验证失败,请重新启动或检查网络设置";
            }
            else if (date1.Length  < 1)
            {
                localtime = "网络验证失败,请重新启动或检查网络设置";
            }
            else
            {
                //将时间中的GMT去掉
                date2 = date1[1].Replace("GMT", "");

                //如: 08 Feb 2012 06:34:58 GMT
                date3 = date2.Split(' ');
                //如: 08 Feb 2012 06:34:58 

                switch (date3[2])
                {
                    case  "Jan":
                        mon = "01";
                        break;
                    case "Feb":
                        mon = "02";
                        break;
                    case "Mar":
                        mon = "03";
                        break;
                    case "Apr":
                        mon = "04";
                        break;
                    case "May":
                        mon = "05";
                        break;
                    case "Jun":
                        mon = "06";
                        break;
                    case "Jul":
                        mon = "07";
                        break;
                    case "Aug":
                        mon = "08";
                        break;
                    case "Sep":
                        mon = "09";
                        break;
                    case "Oct":
                        mon = "10";
                        break;
                    case "Nov":
                        mon = "11";
                        break;
                    case "Dec":
                        mon = "12";
                        break;
                }

                //最终反馈是日期和时间
                localtime = date3[3] + "/" + mon + "/" + date3[1] + " " + date3[4];

                //获取的协调世界时
                DateTime sTime = Convert.ToDateTime(localtime);

                //转换为当前计算机所处时区的时间,即东八区时间
               nTime = TimeZone.CurrentTimeZone.ToLocalTime(sTime);
            }
            objHttp = null;
            return nTime;
        }
        #endregion

        #region 获取标准北京时间3,速度500ms-1500ms
        /// <summary>
        /// [3]获取标准北京时间2 ,读取(xml)http://www.time.ac.cn/timeflash.asp?user=flash
        /// </summary>
        /// <returns></returns>
        public DateTime GetStandardTime()
        {
            #region  文件格式
            /// //<?xml version="1.0" encoding="GB2312" ?>
            //- <ntsc>
            //- <time>
            //  <year>2011</year>
            //  <month>7</month>
            //  <day>10</day>
            //  <Weekday />
            //  <hour>19</hour>
            //  <minite>45</minite>
            //  <second>37</second>
            //  <Millisecond />
            //  </time>
            //  </ntsc>
            #endregion

            DateTime dt;
            WebRequest wrt = null;
            WebResponse wrp = null;
            try
            {
                wrt = WebRequest.Create("http://www.time.ac.cn/timeflash.asp?user=flash");
                wrt.Credentials = CredentialCache.DefaultCredentials;

                wrp = wrt.GetResponse();
                StreamReader sr = new StreamReader(wrp.GetResponseStream(), Encoding.UTF8);
                string html = sr.ReadToEnd();
                sr.Close();
                wrp.Close();

                //int yearIndex = html.IndexOf("<year>") ;
                //int secondIndex = html.IndexOf("</second>");
                //html = html.Substring(yearIndex, secondIndex - yearIndex);
                html = html.Substring(51, 109);

                string[] s1 = html.Split(new char[2] { '<', '>' });
                string year = s1[2];
                string month = s1[6];
                string day = s1[10];
                string hour = s1[18];
                string minite = s1[22];
                string second = s1[26];

                dt = DateTime.Parse(year + "-" + month + "-" + day + " " + hour + ":" + minite + ":" + second);
            }
            catch (WebException)
            {
                return DateTime.Parse("0001-1-1");
            }
            catch (Exception)
            {
                return DateTime.Parse("0001-1-1");
            }
            finally
            {
                if (wrp != null)
                    wrp.Close();
                if (wrt != null)
                    wrt.Abort();
            }
            return dt;
        }
        #endregion

        #region 访问标准校时服务器端口获取网络时间 速度:1000-2000ms
        /// <summary>
        /// 获取网络时间,通过标准校时服务器
        /// </summary>
        /// <param name="HostName">主机名</param>
        /// <param name="PortNum">端口号</param>
        /// <returns>DateTime</returns>
        public DateTime GetInternetTime(string HostName, int PortNum)
        {
            DateTime official, localtime;
            string returndata = null;
            string[] dates = new string[4];
            string[] times = new string[4];
            string[] tokens = new string[11];

            TcpClient tcpclient = new TcpClient();
            try
            {
                tcpclient.Connect(HostName, PortNum);

                NetworkStream networkStream = tcpclient.GetStream();
                if (networkStream.CanWrite && networkStream.CanRead)
                {
                    Byte[] sendBytes = Encoding.ASCII.GetBytes("Hello");
                    networkStream.Write(sendBytes, 0, sendBytes.Length);
                    byte[] bytes = new byte[tcpclient.ReceiveBufferSize];
                    networkStream.Read(bytes, 0, (int)tcpclient.ReceiveBufferSize);
                    returndata = Encoding.ASCII.GetString(bytes);
                }
                tcpclient.Close();
            }
            catch (Exception excep)
            {
                throw excep;
            }

            tokens = returndata.Split(' ');
            dates = tokens[1].Split('-');
            times = tokens[2].Split(':');

            official = new DateTime(Int32.Parse(dates[0]) + 2000, Int32.Parse(dates[1]), Int32.Parse(dates[2]),
                    Int32.Parse(times[0]), Int32.Parse(times[1]), Int32.Parse(times[2]));
            localtime = TimeZone.CurrentTimeZone.ToLocalTime(official);
            return localtime;

        }
        #endregion

    }

}

更多精彩内容:http://www.bianceng.cnhttp://www.bianceng.cn/webkf/tools/

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索string
, split
, null
, datetime
, using
, 时间
, localtime r
, String到Date
获取网络时间
c 获取网络时间、android获取网络时间、js获取网络时间、获取网络时间、java获取网络时间,以便于您获取更多的相关知识。

时间: 2025-01-30 11:35:59

YH中多方法获取网络时间的相关文章

多方法获取网络时间

       在做YH维护的时候,偶尔会碰到这样的问题:电脑的非正常关机导致系统时间出错(变为了2002-1-1),从而影响到项目系统的使用.尤其是设计到money的系统,如果时间错误,可能会导致无法想象的后果.所以我们可能需要用系统和网络的双重验证.          通过收集.修改.优化和测试,剔除了一些错误的和速度超慢的,只剩下了4种可行的方案.这些方案中主要有3类:           一.通过向某网站发送请求,获取服务器响应请求的时间           二.获某时间网页的html或x

获取网络时间(国家标准时间)

我们在开发中,很多应用需要读取网络时间来作为一个时间的标准,对业务逻辑进行相对可靠的校验. 下面是Java中(Android一样)读取网络时间的代码: package com.test; import java.io.IOException; import java.net.MalformedURLException; import java.net.URL; import java.net.URLConnection; import java.text.SimpleDateFormat; im

Android编程获取网络时间实例分析

本文实例讲述了Android编程获取网络时间的方法.分享给大家供大家参考,具体如下: 在网上看到的最常见的方式有: public static void main(String[] args) throws Exception { URL url=new URL("http://www.bjtime.cn");//取得资源对象 URLConnection uc=url.openConnection();//生成连接对象 uc.connect(); //发出连接 long ld=uc.g

Lua获取网络时间(获取时间同步服务器的时间)_Lua

网络授时服务是一些网络上的时间服务器提供的时间,一般用于本地时钟同步. 授时服务有很多种,一般我们选择RFC-868.这个协议的工作流程是:(S代表Server,C代表Client) S: 检测端口37 U: 连接到端口37 S: 以32位二进制数发送时间 U: 接收时间 U: 关闭连接 S: 关闭连接 协议非常简单,用TCP连接上后,服务器直接把时间发送回来.发送的是从1900年1月1日午夜到现在的秒数. 使用luasocket 实现的方案有很多种,Lua不一定是最简单的,选择只是出于个人兴趣

使用jquery中height()方法获取各种高度大全

 这篇文章主要介绍了使用jquery中height()方法获取各种高度大全,比如浏览器高度.可视窗口高度.文档高度等,需要的朋友可以参考下    代码如下: alert($(window).height()); //浏览器当前窗口可视区域高度   alert($(document).height()); //浏览器当前窗口文档的高度   alert($(document.body).height());//浏览器当前窗口文档body的高度   alert($(document.body).out

在C#中调用API获取网络信息和流量

流量|网络 最近一项目中要求显示网络流量,而且必须使用C#. 事实上,调用 IpHlpApi.dll 的 GetIfTable API 可以轻易获得网络信息和网络流量.只是要在C#中实现还是比较复杂. 先看看怎么定义该 API [DllImport("IpHlpApi.dll")]        extern static public uint GetIfTable(byte[] pIfTable, ref uint pdwSize, bool bOrder);本来想把 pIfTab

PowerShell中使用Get-Date获取日期时间并格式化输出的例子_PowerShell

在PowerShell中有一个Get-Date的cmdlet,使用它可以直接返回当前的日期和时间.使用-Format参数可以返回当前的年.月.日.时.分.秒等. Get-Date的直接使用 在PowerShell中直接调用Get-Date,可以返回当前的日期和时间,包括年.月.日.时.分.秒.举例如下: 复制代码 代码如下: PS C:\Users\zhanghong> Get-Date 2013年9月9日 22:26:56 Write-Host中使用Get-Date 注意:在Write-Hos

使用jquery中height()方法获取各种高度大全_jquery

复制代码 代码如下: alert($(window).height()); //浏览器当前窗口可视区域高度 alert($(document).height()); //浏览器当前窗口文档的高度 alert($(document.body).height());//浏览器当前窗口文档body的高度 alert($(document.body).outerHeight(true));//浏览器当前窗口文档body的总高度 包括border padding margin alert($(window

iOS获取网络类型的方法汇总_IOS

Reachability类只能区分WIFI和WWAN类型,却无法区分2G网和3G网. 网上也有些方法,却都存在Bug. 经过网上查找资料和测试,基本上总结了以下几种方法: 1.使用导航栏的方式:(私有API) 代码: 复制代码 代码如下: typedef enum {     NetWorkType_None = 0,     NetWorkType_WIFI,     NetWorkType_2G,     NetWorkType_3G, } NetWorkType; UIApplicatio