Javascript获取服务器系统时间

背景

很多时候,比如有些抽奖、倒计时等应用需要用到时间,但是单纯的 new Date() 获取到的本地时间非常之不可靠,因为任何人都可以很容易的修改,这个时候我们就需要用到系统时间。 通常情况下我们会和服务端约定好一个接口,这个接口用来返回系统时间。其实在实际的项目中,这个接口可以省略,我们可以通过另外一种方法获取服务器的时间。

相关技术

如果你熟悉HTTP编程一定会想到什么,对!就是HTTP头。

通常情况下,http头中包含了很多有用的信息,如下面是百度首页的HTTP头:

HTTP/1.1 200 OK
Date: Tue, 24 Jun 2014 09:29:29 GMT
Content-Type: text/html
Transfer-Encoding: chunked
Connection: Keep-Alive
Set-Cookie: BDRCVFR[Y7OWRVY3J9s]=I67x6TjHwwYf0; path=/; domain=.baidu.com
Set-Cookie: BDSVRTM=92; path=/
Set-Cookie: H_PS_PSSID=1468_7236_7157_7254; path=/; domain=.baidu.com
P3P: CP=" OTI DSP COR IVA OUR IND COM "
Cache-Control: private
Expires: Tue, 24 Jun 2014 09:29:29 GMT
Content-Encoding: gzip
Server: BWS/1.1
BDPAGETYPE: 2
BDQID: 0xd4c3d37f00019464
BDUSERID: 29250924

这里我们关注一下 Date 这个字段,如果有办法取到这个字段,一切都好办了!

那么我们要怎么取呢?

很简单,通过xmlhttp对象的 getResponseHeader('Date') 方法

实现

现在,我们知道方法之后,就很好办了。

首先我们向服务器发送一条请求(AJAX),然后取出响应头的 Date 字段,大功告成!

我把这个过程封装成了一个小插件: sysDate

感兴趣的可以去查看源码

使用起来也很方便

var a=sysDate(option);

// 可选字段option, {'url':'/getDate'}
a.done(function(data){
    console.log('done',data);
    // 服务器时间 data 1385003673000'
});

同时它也支持异步调用(有点promise的感觉)

var a=sysDate();

//这里你还以把回调写在异步里面
//等待了3秒钟,然后再去注册done事件,同样有效,是不是很神奇?
setTimeout(function(){
  a.done(function(data){
    console.log('done',data);
    //it will return 'done 1385003673000'
  });
},3000)

下载和源码

感兴趣的同学可以点击这里获取源码,记得start哦 :)

Write a response...
Mofei Zhu
publish
匿名
2015-01-21 10:54
呵呵
0
 Replay
@  
Replay
Mofei
2014-11-27 18:06
@ 其实 只要吧地址写成根目录就好了 '/' , 这样取的是当前站点首页返回的时间戳。简单说,你可以请求当前站点中的任何一个目录来获取时间,不存在跨越问题。
0
 Replay
@Mofei  
Replay
匿名
2014-11-27 18:03
跨域问题怎么解决
0
 Replay
@  
Replay
Mofei
2014-07-01 18:11
@goolei 哈哈 欢迎
0
 Replay
@Mofei  
Replay
剧中人
2014-07-01 18:10
@goolei 哈哈 我也来了
0
 Replay
@剧中人  
Replay
goolei
2014-07-01 18:09
过来逛逛
0
 Replay
@goolei  
Replay