2012-06-25 16 views
6

次のコードをfirefox scratchpadでテストしたところ、興味深い結果が得られましたか?Javascriptの新しい日付は、異なる日付スタイルに対して異なって扱われますか?

var date=new Date("2012-05-12"); 
var date2 = new Date("05/12/2012"); 
date; 
/* 
Fri May 11 2012 17:00:00 GMT-0700 (Pacific Daylight Time) 
*/ 
date2; 
/* 
Sat May 12 2012 00:00:00 GMT-0700 (Pacific Daylight Time) 
*/ 

2つの日付が異なります。明らかにこれはタイムゾーンの問題によるものです。私が欲しいのは、date2の結果です。どのようにしてjsエンジンがISOの日付スタイルを正しく扱えるようにすることができますか?

+0

最初の例で先行ゼロを削除します。 'var date = new Date(" 2012-5-12 ");' – j08691

+0

@ j08691これはFirefoxで少なくとも "無効な日付"エラーを引き起こします。 – Pointy

+0

@Pointy - 良いキャッチ、私はChromeでテストしました。 – j08691

答えて

2

"2012-05-12"という文字列はISO 8601の日付に、 "05/12/2012"はRFC 2822の日付であるという問題があると思います。 ISOフォーマットでは、タイムゾーンの欠如はUTCを意味します。 5月12日の午前0時に、カリフォルニアで(またはあなたがどこにいようと)真夜中に前の午後7時です。

タイムゾーンなしのRFC日付は、ローカルタイムゾーンの深夜のタイムスタンプを使用することを前提にして解析されます。 (まあ、必ずしもあなたタイムゾーン;あな​​たのJavaScriptは、あなたがDate.parse()にこれらの文字列を渡す場合:-)

あなたは違いを見ることができます実行しているコンピュータのタイムゾーン。

RFC日付形式には明示的なタイムゾーンを含めることができますが、ISO形式は使用できません。 (まあ、それはできますが、ブラウザには注意を払っていない、と明らかにIEがすべてでそれらを処理しません。)

編集 —がここに簡単な(ダム;エラーチェックなし)ですあなたをあげる機能その3部構成のISO形式から日付:規格で

function isoDate(str) { 
    var rv = null; 
    str.replace(/^(\d\d\d\d)-(\d\d)-(\d\d)$/, function(_, yr, mn, dy) { 
    rv = new Date(parseInt(yr, 10), parseInt(mn, 10) - 1, parseInt(dy, 10)); 
    }); 
    return rv; 
} 
+0

あなたの答えは、実際に私が考えているものです。しかし、どんな解決策でも...? – NSF

+0

@NSFあなたはISOの日付形式を自分で解析し、明示的に日付を構成することができます。数値で日付を構成する場合は、ローカルのタイムゾーンを想定する必要があります。 – Pointy

0

Date()で、あなたは、実装に依存する方法で、実装依存の形式でISOの日付または日付を解析することができます。より信頼できるものを得るには、既知の形式で日付を解析できる適切なライブラリを使用します。

関連する問題