目的(Goal)
JavaScript からサーバの時刻を取得したい
$ curl -I http://example.com
HTTP/1.1 200 OK
Accept-Ranges: bytes
Cache-Control: max-age=604800
Content-Type: text/html
Date: Tue, 22 Apr 2014 14:57:58 GMT ## <= これを取得したい!
Etag: "359670651"
Expires: Tue, 29 Apr 2014 14:57:58 GMT
Last-Modified: Fri, 09 Aug 2013 23:54:35 GMT
Server: ECS (cpm/F858)
X-Cache: HIT
x-ec-custom-error: 1
Content-Length: 1270
ブラウザが返す時刻(new Date())の値はデバイスに依存してしまいます. 現在時刻を合わせるために Web サーバが返すレスポンスヘッダに含まれる Date の値を JavaScript で取得して使いたい時のメモです.
方法(Method)
サーバの時刻を取得する
callback 関数の引数がサーバからのレスポンスの Date ヘッダを返す関数をつくっておきました.
get_time = ->
dfd = $.Deferred()
$.ajax
type: 'GET',
url: '',
cache: false
.done (res, status, xhr) ->
try
date = new Date(xhr.getResponseHeader('Date'))
catch
date = new Date()
return dfd.resolve(date)
return dfd.promise()
# 使い方
get_time().done (date) ->
console.info(date) # Tue Apr 22 2014 19:30:43 GMT+0900 (JST)
(追記)
古い android の一部端末で Date ヘッダが取得できないことがあると聞いたので, 一応 try/catch しました. android 2.3~ 系端末でいくつか試しましたがいまのところ取得できないものに出逢えていません.
何か JSON を取得したついでにそのサーバの Date ヘッダも欲しい
get_json = (url, success_proc, fail_proc) ->
$.ajax
dataType: 'json',
url: url,
cache: false
.done (res, status, xhr) ->
try
date = new Date(xhr.getResponseHeader('Date'))
catch
date = new Date()
return success_proc(res, date)
.fail ->
fail_proc()
# 使い方
get_json 'hoge.json', (res, date) ->
## 成功時の処理
console.info(date) # Tue Apr 22 2014 19:30:43 GMT+0900 (JST)
, ->
## 失敗時の処理
return
結果 & 感想(Result)
非同期なのでしょうがないのでしょうか... もっとシンプルに書きたかったのですが. 良いライブラリがないか探してみます.