3

2つの日付文字列をDate()オブジェクトでラップして、等しいかどうかを比較しようとしています。私はシアトルに住んでいますが、何らかの理由で、2番目の日付文字列がPSTに変換され、GMTでレンダリングされるため、次のようになります。

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)

Chromeコンソールで上記を試してみてください。同じ結果が得られるはずです。2番目のステートメントをPSTではなくGMTとして評価するようにDateを取得するにはどうすればよいですか?

4

3 に答える 3

4

Date オブジェクトを使用して日付文字列を解析しないでください。これは、ECMAScript ed 3 で実装依存として指定されており、ブラウザ間で一貫して動作しません。ISO8601 日付文字列の 1 つの形式が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());
于 2012-05-23T05:59:59.377 に答える
2

robgのアドバイスを受けて、DateJS または moment.js を見ることできます

于 2012-05-23T06:06:37.333 に答える
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)
于 2012-05-23T06:01:24.670 に答える