6

javascriptライブラリDate.jsを使用して、Date.parse()関数にISO8601形式のUTC0日付を渡すと、同じ日付を表すがローカルタイムゾーンが追加されたオブジェクトを取得していることがわかりました。

例えば、

14:57 UTCの時刻を示している日付:2012-08-27T14:57:00Z(ISO 8601形式)を考えると、なぜこれは10:57GMTではなく14:57GMT-400として解析されるのでしょうか。 -400?

私はそれが実際に動いていることを示すためにフィドルを作成しました。

実際にエラーが発生した場合、または解析結果の理解が正しくない場合は、お知らせください。

4

3 に答える 3

10

うん、それはバグだ-報告されたものでさえ。

代わりにMoment.jsライブラリを使用することをお勧めしますか?たとえば、これ

console.log(moment('2012-08-27T14:57:00Z').toString());

...UTC時刻が指定されていることを正しく認識します。

于 2012-08-27T16:23:08.370 に答える
2

これはDate.jsのエラーのようです。を使用new Date('2012-08-27T14:57:00Z')すると、正しい日付が返されます。

于 2012-08-27T16:11:49.757 に答える
1

これは、DateJSのかなり素晴らしい文法パーサーのバグのある実装が原因です。

基本的に、古いバージョンは組み込みのパーサーを使用できるかどうかを確認しました。新しいバージョンは文法解析を使用しようとしますが、最初に元の手順を試すのを忘れ、文法パーサーはタイムゾーンを使用できません(これはバグですが、別のもの)。

解析関数を次の関数に置き換えます。

$D.parse = function (s) {
    var date, time, r = null;
    if (!s) {
        return null;
    }
    if (s instanceof Date) {
        return s;
    }

    date = new Date(Date._parse(s));
    time = date.getTime();
    // The following will be FALSE if time is NaN which happens if date is an Invalid Date 
    // (yes, invalid dates are still date objects. Go figure.)
    if (time === time) {
        return date;
    } else {
        // try our grammar parser
        try {
            r = $D.Grammar.start.call({}, s.replace(/^\s*(\S*(\s+\S+)*)\s*$/, "$1"));
        } catch (e) {
            return null;
        }
        return ((r[1].length === 0) ? r[0] : null);
    }
};

コアコードの更新バージョン(および将来的に未解決のバグを修正する予定)は、次の場所で入手できます。

https://github.com/abritinthebay/datejs/

于 2013-09-04T23:21:58.440 に答える