2012-06-25 64 views
6

我在firefox暫存器中測試了以下代碼並獲得了有趣的結果?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) 
*/ 

兩個日期是不同的。顯然這是由於時區問題。我想要的是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日上午的午夜時分,在加利福尼亞州(或無論你在哪裏),是在前一天晚上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日期或日期在實現相關的格式,以實現依賴性。爲了獲得更可靠的信息,請使用合適的庫,以某些已知格式解析日期。