爱尚共享网

VB.NET从网络同步时间(非NTP模式)

爱尚共享网2020-07-25学习资料 339 0A+A-

写在前面:之前写过NTP同步时间,也写过从百度时间网页同步时间,但是由于NTP的不稳定性以及百度时间页面不稳定,都无法正常使用。考虑过写一个从别的时间网页中获取时间,后来考虑到有些网页会不定期更新代码,这样就导致从网页源码中分析获取时间并不能长时间有效。某一时间灵光一闪,是不是可以向HTTP页面发送一个请求,然后获取返回的头,获取头里的Date值,于是以下的简单代码就出来了。

本项目基于VS2010,.NET版本号4.0测试通过

先新建一个VB.NET项目,在项目里加入一个模块,代码如下:

Imports System.Net

Module MySyncTime
    Private Const BeiJing = "China Standard Time"
    Public Function 获取网络时间() As Date
        Try
            Dim url As String = "http://www.163.com"
            '创建一个HttpWebRequest对象
                Dim myHttpWebRequest As HttpWebRequest = HttpWebRequest.Create(url)
                '禁止自动响应重定向
                myHttpWebRequest.AllowAutoRedirect = False
                '创建一个HttpWebResponse对象
                Dim myHttpWebResponse As HttpWebResponse = myHttpWebRequest.GetResponse() 
                '获取HTTP报头的Date值,然后转换时间为UTC标准时间,也就是0时区时间
                Dim a As String = TimeZoneInfo.ConvertTimeToUtc(myHttpWebResponse.Headers("Date").ToString) 
                '再将0时区时间转换为任意时区的时间,这里指的是中国标准时间
                Return TimeZoneInfo.ConvertTimeBySystemTimeZoneId(a, TimeZoneInfo.Utc.Id, BeiJing)
                '到这里就已经返回了正常的中国北京时间
            Catch ex As Exception
                    '如果触发了错误,则返回如下一个时间
                Return "1970/1/1 1:1:1"
            End Try
    End Function
End Module

再到项目的主窗体里添加一个按钮,在按钮里写入以下代码:

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim OldTime = Now    '获取当前系统本地时间
        '先判断获取到的时间是不是1970,因为在模块里定义了触发错误才会返回该值,所以到这里来判断
        If CInt(MySyncTime.获取网络时间.Year.ToString) = 1970 Then
            Msgbox("获取网络时间错误!", VbOKOnly, "错误")
        Else'这里表示能够正常获取到时间
            Today = MySyncTime.获取网络时间'先设置日期
            TimeOfDay = MySyncTime.获取网络时间'再设置时间
            Msgbox("对时之前:" & OldTime.Year.ToString & "年" & OldTime.Month.ToString & "月" & OldTime.Day.ToString & "日 " & _
                   OldTime.Hour.ToString & "时" & OldTime.Minute.ToString & "分" & OldTime.Second.ToString & "秒" & vbCrLf & _
                   "对时之后:" & MySyncTime.获取网络时间.Year.ToString & "年" & MySyncTime.获取网络时间.Month.ToString & "月" & MySyncTime.获取网络时间.Day.ToString & "日 " & _
                   MySyncTime.获取网络时间.Hour.ToString & "时" & MySyncTime.获取网络时间.Minute.ToString & "分" & MySyncTime.获取网络时间.Second.ToString & "秒")
        End If
    End Sub

到此,该项目完成,是不是很简单呢。

发表评论