来自Date对象的toJSON函数减去一天

时间:2013-09-20 08:42:13

标签: javascript date

我正在使用Date对象在javascript中进行一些日期操作。 我丢失了一个小时来解决一个错误:在初始化之后,我使用了.toJSON()函数,我的日期减1。这是我正在做的代码示例:

var date = new Date();
console.log(date.getDate()); // print "19"
date.setDate(date.getDate()-1); // print "18"
var formated = date.toJSON().substr(0, 10); // print "2013-09-17"

突然,日期从18变为17。 所以我确保直接在开发者控制台中尝试了这个:

new Date(2013, 09, 19)
Sat Oct 19 2013 00:00:00 GMT+0200 (Paris, Madrid (heure d’été)) // date "19" as it should
new Date(2013, 09, 19).toJSON()
"2013-10-18T22:00:00.000Z" // date "18" as it shouldn't

现在我的问题只是“为什么?”。

这可能来自我的配置吗?

这是一个错误吗?如果是,这是一个已知的错误吗?

4 个答案:

答案 0 :(得分:4)

如果你仔细看:

new Date(2013, 09, 19);
=> Sat Oct 19 2013 00:00:00 GMT+0200 (CEST)

这里有两件事很重要:

  1. 小时:00:00:00
  2. 时区:+0200
  3. 当您再调用.toJSON时,它会将其转换为GMT + 0。

    所以00:00:00 - 2hr = Today -1, hour being 22:00:00

    现在看看:

    new Date(2013, 09, 19).toJSON()
    => "2013-10-18T22:00:00.000Z"
    

    前一天,但小时设为22:00:00

    这就是原因:从GMT+0200切换到GMT+0

    现在有人提出解决方案:Javascript Date.toJSON don't get the timezone offset;)

答案 1 :(得分:0)

这里绝对没有错误,只需查看时区。

答案 2 :(得分:0)

JSON字符串是GMT(这就是最后Z的含义)。您当地时间提前两个小时。所以你的时区19日午夜是格林尼治标准时间18日22:00。

答案 3 :(得分:0)

这是因为-2小时的时间偏移。 尝试做

YourDate.setHours(0, -YourDate.getTimezoneOffset(), 0 0);

这将是一个正确的日期。