zoukankan      html  css  js  c++  java
  • 转载-VB根据网络时间校准本地时间

    通过Internet获得标准时间
    (2009-10-27 21:22:47)
    转载▼
    标签:
    电脑基础
    it
        分类: 电脑基础
    通过Internet获得标准时间
    2009-02-14 23:50
    在一个局域网中,许多系统都要求每台计算机能够保持时间的一致性,WIN2000系统提供了与主域服务器时间同步功能,即工作站只要登录到主域服务器,工作站系统的时间自动与主域服务器时间一致,但接下来的问题是我们如何使主域服务器的时间同步世界标准时间。如要获得世界标准时间,比较精确的做法是使用GPS卫星时钟获得毫秒级精度的标准时间,但这是要money的哦。如果我们在时间精度上只需要秒级的,又能够连接到Internet,则我们可以利用Internet上的标准时间服务器获得标准时间。
    事实上在Internet上有三个不同的时间服务,每一个都由Request for Comment(RFC)定义为Internet日期时间标准。这三个标准分别为:RFC-867、RFC-868和RFC-1305。下面就先介绍RFC-867:
    RFC867 Daytime协议(RFC867 Daytime Protocol)
    本RFC规范了一个ARPA Internet community上的标准。在ARPA Internet上的所有主机应当采用和实现这个标准。
    一个有用的测量和调试工具就是daytime服务。它的作用就是返回当前时间和日期,格式是字符串格式。
    * 基于TCP的daytime服务
    daytime服务是基于TCP的应用,服务器在TCP端口13侦听,一旦有连接建立就返回ASCII形式的日期和时间(接收到的任何数据被忽略),在传送完后关闭连接。
    * 基于UDP的daytime服务
    daytime服务也可以使用UDP协议,它的端口也是13,不过UDP是用数据报传送当前时间的。接收到的数据被忽略。
    * Daytime格式
    对于daytime没有特定的格式,建议使用ASCII可打印字符,空格和回车换行符。daytime应该在一行上。
    下面是两种流行的格式:
    一种流行的格式是:Weekday, Month Day, Year Time-Zone
    例子:Tuesday, February 22, 1982 17:37:43-PST
    另一种流行的格式用于SMTP中:dd mmm yy hh:mm:ss zzz
    例子:02 FEB 82 07:59:01 PST
    
    
    注意:对于机器来说,有用的时间采用了时间协议(Time Protocol RFC-868)
    
    
    接下来我们用VB程序实现通过RFC867协议设置我们自己的计算机系统时间,为使程序简化,程序未进行日期校正,只进行时间校正。在FORM1中添加1个Winsock控件,将下面代码剪贴到FORM1的代码窗体中即可:
    
    
    Option Explicit
    '采用RFC867 Daytime协议获取标准时间例程
    'www.time.ac.cn为中科院国家授时中心,采用北京时间
    '时间格式:Mon Jul 26 09:58:57 2004
    'time.nist.gov为美国标准技术院,采用格灵威时间
    '时间格式:53212 04-07-26 02:00:12 50 0 0 488.3 UTC(NIST) *
    Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
    
    
    Dim NoSrv As Boolean
    Dim TimeFromNet
    
    
    Private Sub Form_Load()
    Winsock1.Protocol = sckTCPProtocol '采用TCP协议
    NetTime "www.time.ac.cn" '首先取中科院国家授时中心时间
    If NoSrv Or TimeFromNet = "" Then
    '若未取到中科院国家授时中心时间,则取美国标准技术院时间
    NetTime "time.nist.gov"
    If NoSrv Or TimeFromNet = "" Then
    '若不能取美国标准技术院时间,则报错
    MsgBox "检测不到网络标准时间服务器time.nist.gov!"
    Else
    '为使网络传输误差减小,第2次再取美国标准技术院时间
    NetTime "time.nist.gov"
    If TimeFromNet = "" Then
    MsgBox "网络标准时间服务器time.nist.gov超时!"
    Else
    TimeFromNet = Mid(TimeFromNet, 17, 8)
    TimeFromNet = TimeSerial((Hour(TimeFromNet) + 8) Mod 24, Minute(TimeFromNet), Second(TimeFromNet))
    Time = TimeFromNet '设置系统时间
    End If
    End If
    Else
    '为使网络传输误差减小,第2次再取中科院国家授时中心时间
    NetTime "www.time.ac.cn"
    If TimeFromNet = "" Then
    MsgBox "网络标准时间服务器www.time.ac.cn超时!"
    Else
    Time = Mid(TimeFromNet, 12, 8) '设置系统时间
    End If
    End If
    End
    End Sub
    
    
    '关闭Winsock子程序
    Private Sub Winsock1_Close()
    If Winsock1.State <> sckClosed Then
    Winsock1.Close
    End If
    End Sub
    
    
    'Winsock接收数据事件
    Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long)
    TimeFromNet = String(bytesTotal, " ")
    Winsock1.GetData TimeFromNet, vbString, bytesTotal
    End Sub
    
    
    'Winsock出错事件
    Private Sub Winsock1_Error(ByVal Number As Integer, Description As String, ByVal Scode As Long, ByVal Source As String, ByVal HelpFile As String, ByVal HelpContext As Long, CancelDisplay As Boolean)
    NoSrv = True
    End Sub
    
    
    '从互联网上标准时间提供网站获取标准时间
    Private Sub NetTime(TimeSrv As String)
    NoSrv = False
    TimeFromNet = ""
    If Winsock1.State <> sckClosed Then Winsock1.Close
    Winsock1.RemoteHost = TimeSrv ' "www.time.ac.cn" 或 "time.nist.gov"
    Winsock1.RemotePort = 13
    Winsock1.LocalPort = 0
    Winsock1.Connect
    Do While TimeFromNet = "" '循环等待标准时间网站返回时间数据
    If NoSrv Then Exit Do '若Winsock出错,则跳出循环等待
    Sleep 55
    DoEvents
    Loop
    If Winsock1.State <> sckClosed Then Winsock1.Close
    End Sub

    --------------本文转载于下

    张云华的博客

    http://blog.sina.com.cn/zh169168

  • 相关阅读:
    网站服务器架构设计
    使用同步或异步的方式完成 I/O 访问和操作(Windows核心编程)
    堆栈上的舞蹈之释放重引用(UAF) 漏洞原理实验分析
    内核模式下的线程同步的分析(Windows核心编程)
    用户模式下的线程同步的分析(Windows核心编程)
    Linux下部署Django项目
    HDU 2075 A|B?
    HDU 2052 Picture
    HDU 2024 C语言合法标识符
    HDU 2026 首字母变大写
  • 原文地址:https://www.cnblogs.com/xbj-hyml/p/3509113.html
Copyright © 2011-2022 走看看