W3C-DTF形式文字列をDateオブジェクトへ変換

0 件のコメント

JavaScriptで、W3C-DTF形式文字列をDateオブジェクトへ変換する関数
一応、タイムゾーンの違いも計算するものを…¢( ・・)ノ゜ポイ
ちなみに、関数名は何となく"JSON.parse"にあわせた作りで(..;)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
var g = g || {};
g.date = g.date || {};
g.date.W3CDTF = {};
 
 
/**
* W3C-DTFフォーマット文字列を分割するための正規表現
*/
g.date.W3CDTF.regexp = new RegExp("^(\\d{4})-?(\\d{2})?-?(\\d{2})?T?(\\d{2})?:?(\\d{2})?:?(\\d{2})?(\\.\\d+)?(\\+|-|Z)?(\\d{2})?:?(\\d{2})?$");
 
 
/**
* W3C-DTFフォーマット文字列からDateオブジェクトへ変換します。
* @param {string} text W3C-DTFフォーマット文字列
* @return {Date} Dateオブジェクト
*/
g.date.W3CDTF.parse = function (text) {
    var splitted;
    var year, month, day, hour, minute, second, millisecond;
    var date;
    var timezoneOffset, machineTimezoneOffset, dataTimezoneOffset;
 
    // 正規表現で分割
    splitted = text.match(g.date.W3CDTF.regexp);
 
    // 各値に振り分け
    year = splitted[1];
    month = splitted[2] ? parseInt(splitted[2], 10) - 1 : 0;
    day = splitted[3] ? parseInt(splitted[3], 10) : 1;
    hour = splitted[4] ? parseInt(splitted[4], 10) : 0;
    minute = splitted[5] ? parseInt(splitted[5], 10) : 0;
    second = splitted[6] ? parseInt(splitted[6], 10) : 0;
    millisecond = splitted[7] ? parseFloat(splitted[7]) * 1000 : 0;
 
    // Dateオブジェクトを生成
    date = new Date(year, month, day, hour, minute, second);
    date.setMilliseconds(millisecond);
 
    // タイムゾーンの違いを計算(単位は"分")
    machineTimezoneOffset = date.getTimezoneOffset();
    if (splitted[8]) {
        switch (splitted[8]) {
            case '+':
                dataTimezoneOffset = -(parseInt(splitted[9], 10) * 60 + parseInt(splitted[10], 10));
                break;
            case '-':
                dataTimezoneOffset = parseInt(splitted[9], 10) * 60 + parseInt(splitted[10], 10);
                break;
            case 'Z':
                dataTimezoneOffset = 0;
                break;
        }
        timezoneOffset = machineTimezoneOffset - dataTimezoneOffset;
 
        // タイムゾーンの違いを吸収する
        date.setTime(date.getTime() - timezoneOffset * 60 * 1000);
    }
 
    return date;
};

W3C-DTFは「1997-07-16T19:20:30+01:00」みたいやつ。 確かC#(.NET)のDateTimeを.ToString()したらこんな文字列になった気がする。。 W3C-DTF形式の日付文字列に関する詳細はW3Cのサイトを参照していただくとして…(^_^;)

正規表現で分割された結果は次のような感じになる…ハズ (というか、デバッグ中のキャプチャだからなってる)

この正規表現がよく分かってないまま、何となく動くものできたから放置プレー中www 配列の0番目に全部一致した文字列が必ず入るのがどうにかしたいけど… 「動いてるからいいや」という思いも。 あ、あと、たぶん正規表現があまり高速ではない気がする… なにせ「?」が多いから(..;)

いったん、ここまでかな… この関数があってるかどうかなんて分からないから、やっぱり、単体テストとかしてみたい。 QUnitもいいけど…jasmine使ってみたいなぁ…

最後に… このブログに興味を持っていただけた方は、 ぜひ 「Facebookページ に いいね!」または 「Twitter の フォロー」 お願いします!!