2012-02-20 25 views
2

是否有可以從所有瀏覽器和地區/時區工作的日期對象的字符串格式(即new Date('date string'))?是否有一種適用於所有瀏覽器和所有地方的Date格式的字符串?

我們嘗試使用yyyy-mm-ddThh:mm:ss+hh:mm的格式suggested in the HTML5 spec,但遇到了Safari和IE的問題。我們嘗試使用mm/dd/yyyy hh:ss:mm這種不太正式的格式,但是據我所知,如果您的區域設置假定第一個數字爲一天(非美國國家/地區),則「月份前一天」格式可能不明確。此外,它不附加一個時區,這個時區在不同的時區會有問題。

+0

我認爲(如果出現一些瘋狂的瀏覽器,或規格的變化長期,例如)使用一些自定義的格式,這將是更好,更穩定,手動分割它,並將它傳遞給不同的Date構造函數。 – bezmax 2012-02-20 15:11:58

+0

日期來自哪裏?你有控制日期的導出部分傳遞給構造嗎? Date構造可以接受年,月,日,以及使用諸如'setHours','setMonth'等方法。 – 2012-02-20 15:12:08

+0

認爲你可能必須編寫自己的,使用毫秒構造函數參數,或者使用類似http: //www.datejs.com/。 – 2012-02-20 15:13:26

回答

3

總之這是一個幾乎不可能完成的承諾,使作爲實現UA依賴。我會建議使用ISO8601格式,因爲這將是標準的前進和使用墊片的日期解析這裏幫助是一個我寫我自己用的:

(function() { 

var d = window.Date, 
    regexIso8601 = /^(\d{4}|\+\d{6})(?:-(\d{2})(?:-(\d{2})(?:T(\d{2}):(\d{2}):(\d{2})\.(\d{1,3})(?:Z|([\-+])(\d{2}):(\d{2}))?)?)?)?$/; 

if (d.parse('2011-11-29T15:52:30.5') !== 1322581950500 || 
    d.parse('2011-11-29T15:52:30.52') !== 1322581950520 || 
    d.parse('2011-11-29T15:52:18.867') !== 1322581938867 || 
    d.parse('2011-11-29T15:52:18.867Z') !== 1322581938867 || 
    d.parse('2011-11-29T15:52:18.867-03:30') !== 1322594538867 || 
    d.parse('2011-11-29') !== 1322524800000 || 
    d.parse('2011-11') !== 1320105600000 || 
    d.parse('2011') !== 1293840000000) { 

    d.__parse = d.parse; 

    d.parse = function(v) { 

     var m = regexIso8601.exec(v); 

     if (m) { 
      return Date.UTC(
       m[1], 
       (m[2] || 1) - 1, 
       m[3] || 1, 
       m[4] - (m[8] ? m[8] + m[9] : 0) || 0, 
       m[5] - (m[8] ? m[8] + m[10] : 0) || 0, 
       m[6] || 0, 
       ((m[7] || 0) + '00').substr(0, 3) 
      ); 
     } 

     return d.__parse.apply(this, arguments); 

    }; 
} 

d.__fromString = d.fromString; 

d.fromString = function(v) { 

    if (!d.__fromString || regexIso8601.test(v)) { 
     return new d(d.parse(v)); 
    } 

    return d.__fromString.apply(this, arguments); 
}; 

})(); 

現在改用Date.fromString(....),每個人都會很高興在OZ的土地!

作品在所有主要瀏覽器,使用這些引用:

http://dev.w3.org/html5/spec/common-microsyntaxes.html

http://www.ecma-international.org/ecma-262/5.1/#sec-15.9.1.15

http://msdn.microsoft.com/en-us/library/windows/apps/ff743760(v=vs.94).aspx

http://msdn.microsoft.com/en-us/library/windows/apps/wz6stk2z(v=vs.94).aspx

http://msdn.microsoft.com/en-us/library/windows/apps/k4w173wk(v=vs.94).aspx

https://connect.microsoft.com/IE/feedback/details/723740/date-parse-and-new-date-fail-on-valid-formats

希望這有助於-ck

UPDATE:(2013年1月21日)

應當注意的是,怎樣纔算「符合標準的行爲」的行爲是要從ECMAScript-262 v5.1更改爲ECMAScript-262 v6.0。請參閱:http://people.mozilla.org/~jorendorff/es6-draft.html#sec-15.9.1.15

語言從:缺席時區偏移值是「Z」。如果時區偏移不存在,則將日期時間解釋爲本地時間。

現在泡菜現在是:鉻,歌劇和移動Safari瀏覽器遵循ES5.1,而IE10,Firefox和桌面Safari似乎跟隨ES6。所以這是一種分裂的決定的,現在......所以這樣需要有此腳本的第二ES6符合標準的版本,這裏亞去:

(function() { 

    var d = window.Date, 
     regexIso8601 = /^(\d{4}|\+\d{6})(?:-(\d{2})(?:-(\d{2})(?:T(\d{2}):(\d{2}):(\d{2})\.(\d{1,})(Z|([\-+])(\d{2}):(\d{2}))?)?)?)?$/, 
     lOff, lHrs, lMin; 

    if (d.parse('2011-11-29T15:52:30.5') !== 1322599950500 || 
     d.parse('2011-11-29T15:52:30.52') !== 1322599950520 || 
     d.parse('2011-11-29T15:52:18.867') !== 1322599938867 || 
     d.parse('2011-11-29T15:52:18.867Z') !== 1322581938867 || 
     d.parse('2011-11-29T15:52:18.867-03:30') !== 1322594538867 || 
     d.parse('2011-11-29') !== 1322524800000 || 
     d.parse('2011-11') !== 1320105600000 || 
     d.parse('2011') !== 1293840000000) { 

     d.__parse = d.parse; 

     lOff = -(new Date().getTimezoneOffset()); 
     lHrs = Math.floor(lOff/60); 
     lMin = lOff % 60; 

     d.parse = function(v) { 

      var m = regexIso8601.exec(v); 

      if (m) { 
       return Date.UTC(
        m[1], 
        (m[2] || 1) - 1, 
        m[3] || 1, 
        m[4] - (m[8] ? m[9] ? m[9] + m[10] : 0 : lHrs) || 0, 
        m[5] - (m[8] ? m[9] ? m[9] + m[11] : 0 : lMin) || 0, 
        m[6] || 0, 
        ((m[7] || 0) + '00').substr(0, 3) 
       ); 
      } 

      return d.__parse.apply(this, arguments); 

     }; 
    } 

    d.__fromString = d.fromString; 

    d.fromString = function(v) { 

     if (!d.__fromString || regexIso8601.test(v)) { 
      return new d(d.parse(v)); 
     } 

     return d.__fromString.apply(this, arguments); 
    }; 

})(); 
+0

我同意,ISO 8601是日期的*標準,並且獨立於語言環境。有關標準的更多信息:http://en.wikipedia.org/wiki/ISO_8601 – 2014-10-13 01:11:26

0

我不知道是否有字符串格式,但使用新的Date(2012,1,20,15,10,0)應該工作。即,Date(Years, Months, Days, Hours, Mins, Seconds)month0索引。

1

Afaik'yyyy-mm-dd hh:mm:ss'是一種格式,您可以在該格式中在每個時區(使用new Date(''yyyy-mm-dd hh:mm:ss'))生成日期。

例如(荷蘭)

new Date('1933-03-17 12:33:03'); 
    //=> Fri Mar 17 1933 12:33:03 GMT+0100 (West-Europa (standaardtijd)) 
new Date('1933-03-17 12:33:03').toUTCString() 
    //=> Fri, 17 Mar 1933 11:33:03 GMT 
+0

這意味着我將在服務器端處理本地化,我不會這樣做。 – Koviko 2012-02-20 15:31:26

+1

???對不起,我不明白它爲什麼會暗示這一點。 – KooiInc 2012-02-20 15:33:32

+0

假設服務器在EST時區向用戶迴應字符串'1933-03-17 12:33:03'。如果我不處理服務器端的本地化,那麼相同的字符串將發送給PST時區中的用戶。這個相同的字符串代表不同的時間點,取決於用戶的時區。 – Koviko 2012-02-20 16:26:52

相關問題