2012-05-23 51 views
3

我試圖通過用Date()對象包裝它們來比較兩個日期字符串是否相等。我住在西雅圖,由於某種原因,第二個日期字符串轉換爲PST,然後在GMT渲染,導致下面:Date()將某些日期字符串轉換爲本地時間

new Date("January 1, 2012") 
>>> Sun Jan 01 2012 00:00:00 GMT-0800 (PST) 
new Date("2012-01-01") 
>>> Sat Dec 31 2011 16:00:00 GMT-0800 (PST) 

試試上面的鍍鉻控制檯,你應該得到相同的結果。 如何獲取Date來評估第二條語句,而不是PST?

回答

4

不要使用Date對象來解析日期字符串,它在ECMAScript ed 3中被指定爲依賴於實現的實現,並且在瀏覽器中不一致地工作。 ISO8601日期字符串的一種格式是specified in ES5,但這也不一致。手動解析字符串。

一對夫婦的功能轉換和從UTC ISO8601字符串:

if (!Date.prototype.toUTCISOString) { 

    Date.prototype.toUTCISOString = function() { 
     function addZ(n) { 
     return (n<10? '0' : '') + n; 
     } 
     function addZ2(n) { 
     return (n<10? '00' : n<100? '0' : '') + n; 
     } 
     return this.getUTCFullYear() + '-' + 
      addZ(this.getUTCMonth() + 1) + '-' + 
      addZ(this.getUTCDate()) + 'T' + 
      addZ(this.getUTCHours()) + ':' + 
      addZ(this.getUTCMinutes()) + ':' + 
      addZ(this.getUTCSeconds()) + '.' + 
      addZ2(this.getUTCMilliseconds()) + 'Z'; 
    } 
} 

if (!Date.parseUTCISOString) { 
    Date.parseUTCISOString = function fromUTCISOString(s) { 
     var b = s.split(/[-T:\.Z]/i); 
     var n= new Date(Date.UTC(b[0],b[1]-1,b[2],b[3],b[4],b[5])); 
     return n; 
    } 
} 

var s = '2012-05-21T14:32:12Z' 
var d = Date.parseUTCISOString(s); 

alert('Original string: ' + s + 
     '\nEquivalent local time: ' + d + 
     '\nBack to UTC string: ' + d.toUTCISOString()); 
0

那是因爲你的時區,你是8:00小時晚了"2012-01-01",所以其呈現這樣,對我來說我得到這個

new Date("January 1, 2012") 
Sun Jan 01 2012 00:00:00 GMT+0530 (IST) 
new Date("2012-01-01") 
Sun Jan 01 2012 05:30:00 GMT+0530 (IST) 
2

robg的建議你可能看DateJSmoment.js

+0

是一個比其他更好嗎? datejs有一個很長的沒有人分配的錯誤列表。是moment.js更好? –

+0

你使用的函數中的一個錯誤是一個殺手。您不使用的功能中的許多錯誤不會影響您。買者自負! – HBP

+0

即使使用日期庫,也必須告訴它格式,以便知道如何解析字符串。所以你必須從一開始就知道格式,如果你知道格式,手動解析它並不是很難。 – RobG

相關問題