为什么JavaScript getDate()有时会返回上一个日期?

时间:2015-09-24 19:08:31

标签: javascript datetime

这是五个案例。最后三个案例的结果令我感到惊讶。

// Firefox 40.0.3
// Eastern time zone (ET)

var d;
d = new Date("January 1, 2015");
alert('Month: ' + d.getMonth() + ' Date: ' + d.getDate() + ' UTC: ' + d.toUTCString());
// Month: 0 Date: 1 UTC: Thu, 01 Jan 2015 05:00:00 GMT

d = new Date("January 2, 2015");
alert('Month: ' + d.getMonth() + ' Date: ' + d.getDate() + ' UTC: ' + d.toUTCString());
// Month: 0 Date: 2 UTC: Fri, 02 Jan 2015 05:00:00 GMT

d = new Date("January 1, 2015 00:00:00 GMT");
alert('Month: ' + d.getMonth() + ' Date: ' + d.getDate() + ' UTC: ' + d.toUTCString());
// Month: 11 Date: 31 UTC: Thu, 01 Jan 2015 00:00:00 GMT

d = new Date("2015-01-01");
alert('Month: ' + d.getMonth() + ' Date: ' + d.getDate() + ' UTC: ' + d.toUTCString());
// Month: 11 Date: 31 UTC: Thu, 01 Jan 2015 00:00:00 GMT

d = new Date("2015-01-02");
alert('Month: ' + d.getMonth() + ' Date: ' + d.getDate() + ' UTC: ' + d.toUTCString());
// Month: 0 Date: 1 UTC: Fri, 02 Jan 2015 00:00:00 GMT

UTC和当地时间之间必须存在一些差异。我看到了部分答案。函数getDate()根据当地时间返回指定的日期。

似乎对于getDate(),格林威治标准时间00:00:00是当地时间的前一天,所以我得到的是上一个日期,而不是我的预期日期。

也许我真正应该问的是为什么Date构造函数有时会将参数解释为本地时间,有时候将其解释为UTC时间?有什么规则?

jsfiddle

3 个答案:

答案 0 :(得分:3)

请参阅documentation

具体 - “如果未指定时区且字符串采用ES5识别的ISO格式,则假定为UTC .GTT和UTC被视为等效。本地时区用于解释RFC2822第3.3节格式的参数(或ES5中未被识别为ISO 8601的任何格式)不包含时区信息“

“如果日期字符串为”2014年3月7日“,则parse()会假定为本地时区,但如果采用ISO格式(如”2014-03-07“),则会假定为UTC时区。因此日期除非使用UTC“

的本地时区设置系统,否则使用这些字符串生成的对象将表示不同的时刻

最后两个示例是“ES5识别的ISO格式”

答案 1 :(得分:1)

日期(“2015年1月1日”)被解释为当地日期 日期(“2015-01-01”)被解释为ES5中的UTC日期,ES6中的本地日期 getDate()获取本地日期 getUTCdate()获取UTC日期。

当你混合搭配本地和UTC时,你会得到令人惊讶的结果。

谢谢,@ preston-s。你的评论让我在回答我的问题上走了很长的路。但是,有趣的是,Date(“2015-01-01”)的解释将从ES5中的UTC更改为ES6中的本地时间。有谁知道什么时候不同的浏览器会切换到新的行为?我希望在那个时候有些事情可以打破。

ES5: '缺席时区偏移的值是“Z”。'

ES6: '如果没有时区偏移,则将日期时间解释为当地时间。'

鉴于所有这些信息,这里有两个解决方案,可以在ES5和ES6上运行。其他几种解决方案也是可能的 1)使用本地日期进出。

var d;
d = new Date("January 1, 2015");
alert('Month: ' + d.getMonth() + ' Date: ' + d.getDate() + ' UTC: ' + d.toUTCString());
// Month: 0 Date: 1 UTC: Thu, 01 Jan 2015 05:00:00 GMT

2)使用UTC日期进出。拼出时区,这样在ES6中仍然可以使用。

var d;
d = new Date("2015-01-01T00:00:00.000Z");
alert('UTC Month: ' + d.getUTCMonth() + ' UTC Date: ' + d.getUTCDate() + ' UTC: ' + d.toUTCString());
// UTC Month: 0 UTC Date: 1 UTC: Thu, 01 Jan 2015 00:00:00 GMT

答案 2 :(得分:0)

如果您希望getDate()函数将日期返回为01而不是1,这是它的代码。 假设今天的日期是2018年11月11日

var today = new Date();
today = today.getFullYear()+ "-" + (today.getMonth() + 1) + "-" + today.getDate();      
console.log(today);       //Output: 2018-11-1


today = today.getFullYear()+ "-" + (today.getMonth() + 1) + "-" + ((today.getDate() < 10 ? '0' : '') + today.getDate());
console.log(today);        //Output: 2018-11-01