2010-11-30 153 views
77
alert(new Date('2010-11-29')); 

chrome,ff對此沒有問題,但Safari會呼叫「無效日期」。爲什麼?safari中的日期無效

編輯:好的,按下面的評論中,我使用的字符串解析和嘗試這樣:

alert(new Date('11-29-2010')); //doesn't work in safari 
alert(new Date('29-11-2010')); //doesn't work in safari 
alert(new Date('2010-29-11')); //doesn't work in safari 
+0

只爲其他看着同樣的問題: 我結束了使用DateJS,它解決了我的問題整體。請參閱公認的答案的細節。 – Shrinath 2010-12-29 05:24:45

+1

使用[moment.js](http://momentjs.com/docs/)解析時間戳。特別是在處理跨平臺網頁時 – 2013-08-07 05:52:25

+1

這是一個老問題。從ECMAScript 2015開始,ISO 8601僅限日期的字符串被解析爲UTC。但是,可能仍然存在較舊的瀏覽器,它們根本不會解析它或將它視爲本地。 – RobG 2017-03-14 06:07:02

回答

103

模式yyyy-MM-dd不是Date構造一個正式支持的格式。 Firefox似乎支持它,但不要指望其他瀏覽器也這樣做。

下面是一些支持串,從this site採取:

  • MM-DD-YYYY
  • YYYY/MM/DD
  • MM/DD/YYYY
  • MMMM DD,YYYY
  • MMM DD,YYYY

DateJS好像一個用於解析非標準日期格式的好庫。

編輯:剛剛檢查ECMA-262 standard。從部分15.9.1.15報價:

日期時間字符串格式

ECMAScript中定義了基於ISO 8601 擴展格式的簡化的日期時間 字符串 交換格式。格式 如下:YYYY-MM-DDTHH:MM:ss.sssZ 凡字段說明如下:

  • YYYY是一年的公曆的小數位數。
  • 「 - 」(hyphon)字面上出現兩次。
  • MM是從01(1月)到12(12月)的一年中的月份。
  • DD是從01到31的月份的一天。
  • 「T」字面上出現在字符串中,表示 時間元素的開始。
  • HH是從午夜開始經過的完整小時數,爲兩個 十進制數字。
  • 「:」(冒號)字符串中出現兩次。
  • mm是自小時開始以來的完整分鐘數 兩位十進制數字。
  • ss是從分鐘 開始的完整秒數,以兩位十進制數字表示。
  • 「。」 (點)字面上出現在字符串中。
  • sss是自 秒開始以來的完整毫秒數,爲三位十進制數字。 這兩個「。」並且可以省略毫秒字段 。
  • Z爲時區指定爲「Z」(對於UTC)或任一「+」或偏移「 - 」 後跟一個時間表達爲hh:mm

此格式包括日期唯一形式:

  • YYYY
  • YYYY-MM
  • YYYY-MM-DD

還我ncludes僅時間形成與 可選的時區偏移所附:

  • THH:毫米
  • THH:MM:SS
  • THH:MM:SS.SSS

還包括「日期時間」,其中 可以是上述的任何組合。

因此,似乎YYYY-MM-DD被包含在標準中,但由於某些原因,Safari不支持它。

更新:看着datejs documentation,使用它後,你的問題應該用這樣的代碼來解決:

var myDate1 = Date.parseExact("29-11-2010", "dd-MM-yyyy"); 
var myDate2 = Date.parseExact("11-29-2010", "MM-dd-yyyy"); 
var myDate3 = Date.parseExact("2010-11-29", "yyyy-MM-dd"); 
var myDate4 = Date.parseExact("2010-29-11", "yyyy-dd-MM"); 
+3

ISO8601格式用於ECMAScript標準的第5版,並且還沒有得到廣泛支持,最安全的方法去IMO,手動解析日期:( – CMS 2010-11-30 06:25:09

+2

AAARRRGGGHHH !!!它再次手動回來..: ( – Shrinath 2010-11-30 07:09:25

+2

字符串也不能在safari中工作:( – Shrinath 2010-12-01 04:13:20

3

雖然你可能希望瀏覽器將支持ISO 8601(或其日期只子集) , 不是這種情況。我所知道的所有瀏覽器(至少在我使用的美國/英語語言環境中)都能夠解析可怕的美國MM/DD/YYYY格式。

如果你已經有日期的部分,你可以改爲嘗試使用Date.UTC()。如果你沒有,但你必須使用YYYY-MM-DD格式,我建議使用正則表達式來解析你知道的棋子,然後將它們傳遞給Date.UTC()

128

對我來說,只是因爲Safari不能正確地執行它而實施一個新的庫太多了,而正則表達式卻是過度的。 這裏是oneliner

console.log (new Date('2011-04-12'.replace(/-/g, "/"))); 
4

爲了有一個解決大多數瀏覽器上工作,你應該用這種格式創建日期對象

(year, month, date, hours, minutes, seconds, ms) 

如:

dateObj = new Date(2014, 6, 25); //UTC time/Months are mapped from 0 to 11 
alert(dateObj.getTime()); //gives back timestamp in ms 

適用於IE,FF,Chrome和Safari。甚至更舊的版本。

IE Dev Center: Date Object (JavaScript)

Mozilla Dev Network: Date

4

我有我以前moment.Js .Problem消失了一樣issue.Then。

當創建一個字符串的時刻,我們首先檢查是否知道ISO 8601的格式字符串 匹配,然後回落到如果 未發現已知的格式新的日期(字符串)。

警告:瀏覽器對解析字符串的支持不一致。由於 沒有規定應支持哪種格式,因此某些瀏覽器中的 工作將無法在其他瀏覽器中使用。

爲了解析除ISO 8601字符串以外的任何其他結果,您應該使用String + Format。

例如,

var date= moment(String); 
-1

使用'mm/dd/yyyy'格式。例如: - 新日期('02/28/2015')。它適用於所有瀏覽器。

4

字符串轉換爲日期fromat(你必須知道服務器時區)

new Date('2015-06-16 11:00:00'.replace(/\s+/g, 'T').concat('.000+08:00')).getTime() 

其中+08:00 =從服務器

6

的timeZone我用時間來解決這個問題。 例如

var startDate = moment('2015-07-06 08:00', 'YYYY-MM-DD HH:mm').toDate(); 
1

使用以下格式,它會在所有的瀏覽器工作

var year = 2016; 
var month = 02;   // month varies from 0-11 (Jan-Dec) 
var day = 23; 

month = month<10?"0"+month:month;  // to ensure YYYY-MM-DD format 
day = day<10?"0"+day:day; 

dateObj = new Date(year+"-"+month+"-"+day); 

alert(dateObj); 

//你的輸出應該是這樣的「週三2016年3月23日00:00:00 GMT + 0530 (IST)」

//注意,這將是在這種情況下,當前時區由IST表示,轉換爲UTC時區可以包括

alert(dateObj.toUTCSting); 

//你現在的輸出會是這樣的「2016年3月22日18:30:00 GMT」

請注意,現在dateObj以GMT格式顯示時間,還請注意日期和時間已經相應地更改。

「toUTCSting」函數檢索格林威治子午線的相應時間。通過確定您當前的時區與格林尼治子午時區之間的時差來完成此操作。

在上述情況下,轉換前的時間爲2016年3月23日00:00小時和分鐘。並且在從GMT + 0530(IST)小時轉換爲GMT(基本上減去5.30小時在這種情況下給出時間戳),則時間反映了2016年3月22日的18.30小時(恰好在第一次後的5.30小時)。

進一步轉換任何Date對象時間戳您可以使用

alert(dateObj.getTime()); 

//輸出將類似於此的東西「1458671400000」

這會給你時間的唯一時間戳

1

如何劫持Datefix-date?沒有依賴關係,min + gzip = 280 B

5

我正面臨類似的問題。 Date.Parse( 「DATESTRING」)正在對Chrome瀏覽器(版本59.0.3071.115),但不是Safari瀏覽器(版本10.1.1(11603.2.5))

Safari瀏覽器:

Date.parse("2017-01-22 11:57:00") 
NaN 

鉻:

Date.parse("2017-01-22 11:57:00") 
1485115020000 

解決方案爲我工作是用「T」替換dateString中的空間。 (例如:dateString.replace(//g的, 「T」))

Safari中:

Date.parse("2017-01-22T11:57:00") 
1485086220000 

鉻:

Date.parse("2017-01-22T11:57:00") 
1485115020000 

注意,從Safari瀏覽器的響應爲8小時(28800000ms)小於Chrome瀏覽器中顯示的響應,因爲Safari在本地TZ(即UTC的後面8小時)返回響應

爲了同時獲得兩個時間TZ

Safari瀏覽器:

Date.parse("2017-01-22T11:57:00Z") 
1485086220000 

鉻:

Date.parse("2017-01-22T11:57:00Z") 
1485086220000 
0

在Safari面臨同樣的問題,這是通過在網頁中插入該解決

<script src="https://cdn.polyfill.io/v2/polyfill.min.js?features=Intl.~locale.en"></script> 

希望它也將你的工作案例太

謝謝