13

那么问题是我使用的是这样的代码:

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

将我的日期作为YYYY-MM-DD字符串,然后我在一些 mysql 查询和一些条件语句中使用它作为参数。在一天结束时,我没有得到正确的日期,因为它仍然在前一天(我的时区偏移量是 +2/3 小时)。

我没有注意到该toJSON方法没有考虑到您的时区偏移量,所以我最终得到了这个 hacky 解决方案:

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 回答
0

我没有注意到 toJSON 方法没有考虑到您的时区偏移

但确实如此,它将本地时间转换为祖鲁语(查看字符串的末尾:Z)

new Date( "2012-01-02T03:04:05+02:00" ).toJSON()
"2012-01-02T01:04:05.000Z"
于 2012-07-08T11:22:23.423 回答