13

問題は、次のようなコードを使用していたことです。

new Date().toJSON().slice(0, 10)

日付をYYYY-MM-DD文字列として取得するには、一部の mysql クエリと一部の条件ステートメントでパラメーターのように使用します。結局のところ、まだ前日だったので、正しい日付を取得できませんでした (タイムゾーンのオフセットは +2/3 時間です)。

toJSONメソッドがタイムゾーンのオフセットを考慮していないことに気付いていないので、このハッキーな解決策に行き着きました:

var today = new Date();
today.setHours( today.getHours()+(today.getTimezoneOffset()/-60) );
console.log(today.toJSON().slice(0, 10));

よりエレガントなソリューションはありますか?

4

2 に答える 2

16

ECMAScriptの日付オブジェクトは内部的にUTCです。タイムゾーンオフセットは現地時間に使用されます。

Date.prototype.toJSONの仕様では、Date.prototype.toISOStringを使用すると記載されており、「タイムゾーンは常にUTCである」と記載されています。ソリューションが行っているのは、日付オブジェクトのUTC時間値をタイムゾーンオフセットでオフセットすることです。

Date.prototypeに独自のメソッドを追加することを検討してください。

Date.prototype.toJSONLocal = function() {
  function addZ(n) {
    return (n<10? '0' : '') + n;
  }
  return this.getFullYear() + '-' + 
         addZ(this.getMonth() + 1) + '-' + 
         addZ(this.getDate());
} 

編集

余分なパフォーマンスを絞りたい場合は、次の方が高速です。

Date.prototype.toJSONLocal = (function() {
    function addZ(n) {
        return (n<10? '0' : '') + n;
    }
    return function() {
      return this.getFullYear() + '-' +
             addZ(this.getMonth() + 1) + '-' +
             addZ(this.getDate());
    };
}())

しかし、それは時期尚早の最適化のスマックなので、非常に短い期間に何千回もそれを呼び出さない限り、私は気にしません。

于 2012-07-08T12:08:11.407 に答える