2017-01-02 85 views
0

我使用日期類toLocaleDateString()在項目中的JavaScript函數根據用戶的區域設置得到正確的格式,非常簡單。但是,這個月的日子並不總是正確的(比預期的要少一天)。我似乎無法理解爲什麼會發生這種情況。錯誤的日期與JavaScript函數toLocaleDateString()

我建立了一個jsfiddle來顯示問題。它發生在十月份。該日期應爲3像所有其他月份,但不知何故這是2

https://jsfiddle.net/vincepunkrock/nh1u3ord/

這裏是代碼的重要組成部分,結果(我的語言環境是「德」):

for(var i = 0; i < 12; i++) 
{ 
    var d = new Date(1993,i,3); 
    var n = d.toLocaleDateString(); 
    document.getElementById("demo").innerHTML += n + "<br>"; 
} 

3.1.1993 
3.2.1993 
3.3.1993 
3.4.1993 
3.5.1993 
3.6.1993 
3.7.1993 
3.8.1993 
3.9.1993 
2.10.1993 
3.11.1993 
3.12.1993 

你們對這裏發生了什麼有了一個想法,我能做些什麼來解決它?

非常感謝!

+2

「夏令時」(或「夏令時」)在1993年在您的語言環境中何時結束? – Pointy

+0

它是在9月。第26位。事實上,當我將日期設置爲27日時,我在9月和10月份獲得了26日。你在正確的軌道上! –

+0

「* ...根據用戶的區域設置... *」獲取正確的格式。不能保證會發生,因爲* toLocaleDateString *完全依賴於實現,有些實現似乎完全忽略了用戶設置。 – RobG

回答

1

我想波蒂用他的評論將它釘在了一起。 toLocalDateString絕對包含在DST中,假定時間爲00:00:0000,因爲它沒有被指定,所以「後退」小時進入前一天。我不確定你的語言環境只會在一個月內發生,但我不是時區專業人士。該劇本適合我。

更新:如果這不是您想要的行爲,將新日期中的「時間」設置爲一天的中間時間,則夏令時調整將不會來回跳轉到不同的日期。

var d = new Date(1993,i,3, 12,30,30,30); 
+0

如何處理變更的確切時刻的DST更改在不同的實現之間有所不同。在任何時候將時間設置爲午夜後的一小時或更多小時應該足夠了,因爲無處變化超過一小時(有些小於一小時),所以'new Date(1993,i,3,1)'應該足夠。 ;-) – RobG

0

適用於我與法語語言優先。看起來瀏覽器的語言設置會以一種奇怪的方式影響結果。 檢查您的瀏覽器語言設置。

+0

在方法名稱中使用「Locale」是不恰當的。 * toLocaleString *方法完全依賴於實現,並且不考慮「locale」,否則它們會根據設備的地理位置來改變字符串的格式,而不是用戶設置(這是他們實際上似乎做的事情,如果他們使用任何東西)。 – RobG