2013-10-24 74 views
2

第一次嘗試是在IE 9控制檯:Chrome不JavaScript中返回正確小時

new Date('2013-10-24T07:32:53') 
Thu Oct 24 07:32:53 UTC+0200 2013 

收益預期

下一頁嘗試是在Firefox 24控制檯:

new Date('2013-10-24T07:32:53') 
Date {Thu Oct 24 2013 07:32:53 GMT+0200 (Central Europe Standard Time)} 

然後我進入Chrome 30控制檯:

new Date('2013-10-24T07:32:53') 
Thu Oct 24 2013 09:32:53 GMT+0200 (Central Europe Daylight Time) 

但是時間是這裏,它應該是。

這是鉻的錯誤還是我在這裏做錯了什麼?

我不能使用除了這個'2013-10-24T07:32:53'之外的任何其他格式,我從C#中獲取JSON。 我需要得到這個時間戳的小時,getHours我在Chrome中獲得incorect值。

解決方案:

var inputHour = input.split('T')[1]; 
inputHour = inputHour.substring(0, 2); 
+0

Chrome似乎希望您在格林威治標準時間通過它,並將其轉換爲當地時間。其他瀏覽器正在將您傳遞的字符串解釋爲當地時間。我不確定哪個是正確的,或者它是否是規範的一部分。 –

+0

@ MikeEdwards-ECMA-262 ed 5僅指定一個字符串:[ISO 9601的一個版本,即UTC](http://www.ecma-international.org/ecma-262/5.1/#sec-15.9.1.15) 。如果省略了時區指示符(Z),那麼您又回到了與實現相關的實現(並且IE 8和更低版本無法正確解析ISO字符串)。 – RobG

+0

@ Rumplin - 在符合ES5標準的瀏覽器的末端放置一個「Z」,它仍然會在IE 8及更低版本中失敗。 – RobG

回答

5

它沒有錯誤。日期解析函數的實現在瀏覽器&中有所不同,其接受的dateString的格式也是如此。

但是這種格式似乎整個工作同... link

new Date("October 13, 1975 11:13:00") 

如果可能的話,儘量使用

new Date(year, month, day, hours, minutes, seconds, milliseconds) 

爲保證結果。


關於您的格式,請嘗試自己解析它。喜歡的東西:

var str = '2013-10-24T07:32:53'.split("T"); 
var date = str[0].split("-"); 
var time = str[1].split(":"); 

var myDate = new Date(date[0], date[1]-1, date[2], time[0], time[1], time[2], 0); 

(感謝RobG此):上面使用的日期構造函數需要每月0 - 11 &,因爲十月是10按日期字符串,該月是在將其傳遞給構造函數之前進行了修改。

Reference

+0

我不能使用任何其他格式。我從Web服務中獲得「2013-10-24T07:32:53」,並需要從該JSON日期時間格式獲得小時。 – Rumplin

+2

爲什麼不將字符串拆分爲'T'並自己構造新的日期時間字符串然後... – loxxy

+0

我使用了你的解決方案 – Rumplin

2

看到這個線程:

Why does Date.parse give incorrect results?

它看起來像Date構造函數的解析簽名的行爲是完全依賴於實現的。

+0

new Date(Date.parse('2013-10-24T07:32:53'));返回相同的結果,因爲沒有'解析' – Rumplin

+1

@ Rumplin - 我想你錯過了答案:Date.parse方法完全依賴於實現...我建議你手動解析日期字符串,這是非常合理的建議。 – RobG

+0

我做到了,謝謝。 – Rumplin

0

考慮:

var s = '2013-10-24T07:32:53'; 

在ES5兼容的瀏覽器,你可以這樣做:

var d = new Date(s + 'Z'); 

但對於跨所有正在使用的瀏覽器的兼容性,更好的使用(假設日期是UTC):

function dateFromString(s) { 
    s = s.split(/\D/); 
    return new Date(Date.UTC(s[0],--s[1],s[2],s[3],s[4],s[5])); 
}