【分享】 vb获得网络时间的几个函数(史上最全,有的可能是你第一次见过 :) )

无·法 2017-01-18 05:49:44
一般获取网络时间的方法都是去找到个可以显示时间的网址,这里列几个比较可靠的:
http://www.beijing-time.org/time15.asp
http://api.k780.com:88/?app=life.time&appkey=10003&sign=b59bc3ef6191eb9f747dd4e83c99f2a4&format=json

不过这些可能会随着人家网址变更或接口收费等更新导致失效。

今天下午专门研究了下怎样可以比较可靠的获取网络的时间的问题,发现网上有个java写的代码可以根据任何一个网站访问返回的头信息里取时间,相当于去获得这个网站的服务器时间,这样的话我们去获取百度阿里等大网站的服务器时间,这样就比较可靠了,而且一般也不会出现不可访问的问题。研究了下得到了GMT时间,然后又花了不少时间通过js中转终于可以得到我们的标准时间了。如果有谁有把GMT时间简便转换为标准北京时间的代码的话请提供下。

Private Sub Form_Load()
MsgBox getWebDatetime
End Sub

'方法一,根据个别网址得到时间,由于网站不确定性可能会更新导致失效。不推荐
Private Function getWebDatetime() As String
Dim strData As String
Dim reg As Object
Dim XmlHttp As Object
Set XmlHttp = CreateObject("Microsoft.XMLHTTP")
XmlHttp.Open "GET", "http://www.beijing-time.org/time15.asp", False
XmlHttp.SetRequestHeader "If-Modified-Since", "0"
XmlHttp.send
strData = StrConv(XmlHttp.ResponseBody, vbUnicode)
Set XmlHttp = Nothing

Set reg = CreateObject("vbscript.regExp")
reg.Global = True
reg.IgnoreCase = True
reg.MultiLine = True
reg.Pattern = "[\s\S]*?(\d{4})[\s\S]*?(\d+)[\s\S]*?(\d+)[\s\S]*?(?:\d+)[\s\S]*?(\d+)[\s\S]*?(\d+)[\s\S]*?(\d+);.*"
getWebDatetime = reg.Replace(strData, "$1-$2-$3 $4:$5:$6")
End Function

方法二,根据网上提供的一些接口提供。推荐
'直接调用getWebDatetime获取网络日期时间
Public Function getWebDatetime() As String
Dim XmlHttp As Object, objJs As Object, objStream As Object

Set XmlHttp = CreateObject("Microsoft.XMLHTTP")
XmlHttp.Open "GET", "http://api.k780.com:88/?app=life.time&appkey=10003&sign=b59bc3ef6191eb9f747dd4e83c99f2a4&format=json", False
XmlHttp.SetRequestHeader "If-Modified-Since", "0"
XmlHttp.send

Set objStream = CreateObject("Adodb.Stream")
objStream.Type = 1
objStream.Mode = 3
objStream.Open
objStream.Write XmlHttp.ResponseBody
objStream.position = 0
objStream.Type = 2
objStream.Charset = "UTF-8"

Set objJs = CreateObject("msscriptcontrol.scriptcontrol")
objJs.Language = "jScript"
getWebDatetime = objJs.eval("eval(" & objStream.ReadText & ").result.datetime_1")

objStream.Close
Set objStream = Nothing
Set XmlHttp = Nothing
Set objJs = Nothing
End Function

'方法三,读取网站服务器返回的时间,这里的百度网站可以换成任何其他的例如淘宝。强烈推荐
Private Function getWebDatetime() As String
Dim XmlHttp As Object, objJs As Object
Set XmlHttp = CreateObject("Microsoft.XMLHTTP")
XmlHttp.Open "POST", "http://www.baidu.com", False
XmlHttp.send
Set objJs = CreateObject("msscriptcontrol.scriptcontrol")
objJs.Language = "jScript"
getWebDatetime = objJs.Eval("var dt = new Date('" & XmlHttp.getResponseHeader("Date") & "');var date = [ [dt.getFullYear(), dt.getMonth() + 1, dt.getDate()].join('-'), [dt.getHours(), dt.getMinutes(), dt.getSeconds()].join(':')].join(' ').replace(/(?=\b\d\b)/g, '0');date;")
Set XmlHttp = Nothing
Set objJs = Nothing
End Function

'方法四,直接用vb转换GMT时间(网友Chen8013提供),强烈推荐推荐
Private Function getWebDatetime() As String
Dim XmlHttp As Object
Set XmlHttp = CreateObject("Microsoft.XMLHTTP")
XmlHttp.Open "POST", "http://www.baidu.com", False
XmlHttp.send
getWebDatetime = CDate(1 / 3 + CDbl(CDate(Mid$(XmlHttp.getResponseHeader("Date"), 5, 21))))
Set XmlHttp = Nothing
End Function


...全文
963 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
舉杯邀明月 2017-01-20
  • 打赏
  • 举报
回复
你是贵人多忘事啊? 我们在QQ上聊天给你说过的,就忘记了? 这还没多久啊………… 日期/时间,对应一个“浮点数值”, 其整数部分,就是表示从“某一个日期”(日历的“基点”,就类似坐标轴的原点)起,已经过了多少天了;  小数部分,则表示“当天”已经过了多久了。  比如“0.0”的时候,是“0:00:00”,“0.1”就表示过了“0.1天”,就是2.4小时,也就是到02:24:00了,  又比如,要表示06:00:00,就是1/4天,即:0.25;表示中午12点正,就是“半天” = 0.5;   下午3点正,就是 15/24 = 5/8 = 0.625 。
无·法 2017-01-20
  • 打赏
  • 举报
回复
好吧。可能没留意。vb中的日期还可以这样弄.

刚从帮助文档中看到了
使用 IsDate 函数,可判断 date 是否可以被转换为日期或时间。Cdate 可用来识别日期文字和时间文字,以及落入可接受的日期范围内的数值。当转换一个数字成为日期时,是将整数部分转换为日期,小数部分转换为从午夜起算的时间。
无·法 2017-01-19
  • 打赏
  • 举报
回复
引用 13 楼 Chen8013 的回复:
把GMT时间转换成“北京时间”,要+8小时,我在这儿的2楼中已经给你说了啊。 为什么是“1/3”,因为“1天”是24小时, 8/24 就等于 1/3 啊。
为什么cdbl对年月日转换下加上一个数值就表示天呢。
舉杯邀明月 2017-01-19
  • 打赏
  • 举报
回复
把GMT时间转换成“北京时间”,要+8小时,我在这儿的2楼中已经给你说了啊。 为什么是“1/3”,因为“1天”是24小时, 8/24 就等于 1/3 啊。
无·法 2017-01-19
  • 打赏
  • 举报
回复
引用 11 楼 Chen8013 的回复:
VB6代码处理,关键点就是:去掉前4个、去掉后3个,剩下的不必多想。 然后,你需要如何用就如何去用。
还是你厉害。 我不知道Jan直接就可以放里面用cdate可以转换。 然后为什么cdbl转换下用三分一直接加上就可以呢 这个还真不知道。。 看了你发的感觉好像vb什么都不会了 改进下
Private Function getWebDatetime() As String
    Dim XmlHttp As Object
    Set XmlHttp = CreateObject("Microsoft.XMLHTTP")
    XmlHttp.Open "POST", "http://www.baidu.com", False
    XmlHttp.send
    getWebDatetime = CDate(1 / 3 + CDbl(CDate(Mid$(XmlHttp.getResponseHeader("Date"), 5, 21))))
    Set XmlHttp = Nothing
End Function
赵4老师 2017-01-19
  • 打赏
  • 举报
回复
熊孩子开学喽 2017-01-19
  • 打赏
  • 举报
回复
我也用的第三种, 放在一台时间老是走不准的服务器上跑.
舉杯邀明月 2017-01-19
  • 打赏
  • 举报
回复
VB6代码处理,关键点就是:去掉前4个、去掉后3个,剩下的不必多想。 然后,你需要如何用就如何去用。
舉杯邀明月 2017-01-19
  • 打赏
  • 举报
回复
你的 JavaScript 处理的,一个分量一个分量的取, 取出来又要连接、替换什么的,绕了多少弯子啊…………
舉杯邀明月 2017-01-19
  • 打赏
  • 举报
回复
+8小时,是因为“时区”的原因。 你从XmlHttp对象取得的是GMT时间,然后你用JavaScript处理,它的结果是本地时间了? 至于代码哪个方法复杂,写在一起比较就知道了:
var dt = new Date('Thu, 19 Jan 2017 05:47:24 GMT');
var date = [
  [dt.getFullYear(), dt.getMonth() + 1, dt.getDate()].join('-'),
  [dt.getHours(), dt.getMinutes(), dt.getSeconds()].join(':')
].join(' ').replace(/(?=\b\d\b)/g, '0');
这上面是你的代码, 然后我贴VB代码,先来“两步”处理的。
Dim strText As String
strText = Mid$("Thu, 19 Jan 2017 05:47:24 GMT", 5)
strText = Left$(strText, Len(strText) - 4)
MsgBox CDate(strText), 64
再来“一步”的:
Dim strText As String
strText = Mid$("Thu, 19 Jan 2017 05:47:24 GMT", 5, 21)
MsgBox CDate(strText), 64
究竟哪个简单点? 就算“两步处理”,并且还转换成“北京时间”,也就这样而已:
Dim strText As String
strText = Mid$("Thu, 19 Jan 2017 05:47:24 GMT", 5)
strText = Left$(strText, Len(strText) - 4)
MsgBox CDate(1 / 3 + CDbl(CDate(strText))), 64
我感觉VB代码的简单、易懂、易记多了…………
无·法 2017-01-19
  • 打赏
  • 举报
回复
引用 7 楼 Chen8013 的回复:
[quote=引用 6 楼 sysdzw 的回复:] 研究了下,原来XmlHttp.Open "GET", "http://www.baidu.com", False 会拒绝访问。 XmlHttp.Open "POST", "http://www.baidu.com", False 不会提示拒绝访问
原来如此啊………… 我一直都是用的“GET”。  “时间”处理问题: 用XmlHttp.getResponseHeader("Date")返回的结果,都是象这样的格式: Thu, 19 Jan 2017 05:47:24 GMT 这个字符串,当然不能用VB6的 CDate()函数来处理。 但是,在“截头、去尾”之后,就行了…………           strHtmlDate = "Thu, 19 Jan 2017 05:47:24 GMT" 把前4个字符去掉: strText = Mid$( strHtmlDate, 5)   这一步中,用5或6都可以,因为第5个字符是空格,结果中有这个空格不会出错(用5“保证安全”)。 再把"GMT"去掉: strText = left$(strText, Len(strText) - 4)   这一步中,用4或3都行,因为在GMT前至少有一个空格。 经上面两步处理的结果 strText 的值,就可以用于VB6的 CDate()函数了。 用这个“截头、去尾”的方法,可以不管这中间的“日期、时间”是什么样的格式表示的,不会有错。 当然一般来说,可能都是这个“标准格式”。在这种“约定条件”下,可以“一步到位”: strText = Mid$("Thu, 19 Jan 2017 05:47:24 GMT", 5, 21) 或者:strText = Mid$("Thu, 19 Jan 2017 05:47:24 GMT", 6, 20) 这样只要一次字符串处理,就把“中间段”提取出来。 不过我还是按“两步”处理,就是担心“万一”某种系统设置下,它不是这种格式,长度就不一样了。   用两步处理的方式,比较“有安全感”。   [/quote]然后还要加上8小时,真麻烦啊。你写那么多还不如复制代码上来了。大家也要多收藏一例。。 感觉不如调用js处理的方便,直接将整个字符串传递给js里面的日期对象,它是能识别的,然后用类似于datepart函数似得取出年月日时间,稳定可靠。
var dt = new Date('Thu, 19 Jan 2017 05:47:24 GMT');
var date = [
  [dt.getFullYear(), dt.getMonth() + 1, dt.getDate()].join('-'),
  [dt.getHours(), dt.getMinutes(), dt.getSeconds()].join(':')
].join(' ').replace(/(?=\b\d\b)/g, '0');
舉杯邀明月 2017-01-19
  • 打赏
  • 举报
回复
引用 6 楼 sysdzw 的回复:
研究了下,原来XmlHttp.Open "GET", "http://www.baidu.com", False 会拒绝访问。 XmlHttp.Open "POST", "http://www.baidu.com", False 不会提示拒绝访问
原来如此啊………… 我一直都是用的“GET”。  “时间”处理问题: 用XmlHttp.getResponseHeader("Date")返回的结果,都是象这样的格式: Thu, 19 Jan 2017 05:47:24 GMT 这个字符串,当然不能用VB6的 CDate()函数来处理。 但是,在“截头、去尾”之后,就行了…………           strHtmlDate = "Thu, 19 Jan 2017 05:47:24 GMT" 把前4个字符去掉: strText = Mid$( strHtmlDate, 5)   这一步中,用5或6都可以,因为第5个字符是空格,结果中有这个空格不会出错(用5“保证安全”)。 再把"GMT"去掉: strText = left$(strText, Len(strText) - 4)   这一步中,用4或3都行,因为在GMT前至少有一个空格。 经上面两步处理的结果 strText 的值,就可以用于VB6的 CDate()函数了。 用这个“截头、去尾”的方法,可以不管这中间的“日期、时间”是什么样的格式表示的,不会有错。 当然一般来说,可能都是这个“标准格式”。在这种“约定条件”下,可以“一步到位”: strText = Mid$("Thu, 19 Jan 2017 05:47:24 GMT", 5, 21) 或者:strText = Mid$("Thu, 19 Jan 2017 05:47:24 GMT", 6, 20) 这样只要一次字符串处理,就把“中间段”提取出来。 不过我还是按“两步”处理,就是担心“万一”某种系统设置下,它不是这种格式,长度就不一样了。   用两步处理的方式,比较“有安全感”。  
无·法 2017-01-19
  • 打赏
  • 举报
回复
研究了下,原来XmlHttp.Open "GET", "http://www.baidu.com", False 会拒绝访问。 XmlHttp.Open "POST", "http://www.baidu.com", False 不会提示拒绝访问
无·法 2017-01-19
  • 打赏
  • 举报
回复
想不到大家都知道呀,我是孤陋寡闻了。、

引用 3 楼 WallesCai 的回复:
我也用的第三种, 放在一台时间老是走不准的服务器上跑.
我也是,有个vps时间老是莫名其妙的变得不准。定时校正时间用。



引用 2 楼 Chen8013 的回复:
最简单的把“GMT时间转北京时间”,就是把把“GMT时间”
  CDate() (如果是“字符串”的)、再CDbl() 、再“加1/3”(因为北京时间在东八区,比GMT快8小时,就是1/3天),
然后这个“双精度结果值”可以用于VB6中的所有日期、时间相关函数来处理,也可以用于Format函数,
  取得年、月、日、时、分、秒等。
一般都是GMT时间,那些英文的日期月份不好用vb转,用cdate("Thu, 19 Jan 2017 05:47:24 GMT")或cdate("Thu, 19 Jan 2017 05:47:24")都会报错的,要分析日期月份就有点费劲了,你是怎样处理的,代码放出来共享下啊,我这算是抛砖引玉

另外,我这里用“http://www.baidu.com”直接就可以得到时间,不会出现拒绝访问。
舉杯邀明月 2017-01-18
  • 打赏
  • 举报
回复
最简单的把“GMT时间转北京时间”,就是把把“GMT时间”   CDate() (如果是“字符串”的)、再CDbl() 、再“加1/3”(因为北京时间在东八区,比GMT快8小时,就是1/3天), 然后这个“双精度结果值”可以用于VB6中的所有日期、时间相关函数来处理,也可以用于Format函数,   取得年、月、日、时、分、秒等。
舉杯邀明月 2017-01-18
  • 打赏
  • 举报
回复
我用的是第三种方法。 但是“取时间”没有你那么复杂,直接用字符串处理函数“提取”一下时间、日期串,用CDate()函数处理就行了。 另外就是: 如果用“http://www.baidu.com”,在XmlHttp.send会出现异常。 实时错误:-2147024891  (80070005) 拒绝访问。 要把http改为 https 的才行。

7,763

社区成员

发帖
与我相关
我的任务
社区描述
VB 基础类
社区管理员
  • VB基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧