1. naoiwata

    No comment

    naoiwata
Changes in body
Source | HTML | Preview

目的(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) ->
        date = new Date(xhr.getResponseHeader('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)
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) ->
        date = new Date(xhr.getResponseHeader('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
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)

非同期なのでしょうがないのでしょうか... もっとシンプルに書きたかったのですが. 良いライブラリがないか探してみます.

参考資料(Referrences)