2016-12-28 91 views
6

我觉得我在这里错过了一些东西。Date.getDay()返回不同的值

Date.getDay()方法应该从0-6返回一个值。星期日为0,星期六为6。

现在我有两个日期,两者都是“星期天”,这应该返回0。

new Date('1990-11-11').getDay() // returns 6 
new Date('2016-1-3').getDay() // returns 0 

是什么原因造成的差异?我敢于质疑.getDay()方法的有效性,但我无法弄清楚发生了什么。

编辑

> new Date('1990-11-11') 
Sat Nov 10 1990 17:00:00 GMT-0700 (MST) 
> new Date('2016-01-03') 
Sat Jan 02 2016 17:00:00 GMT-0700 (MST) 
> new Date('2016-1-3') // they say this format is wrong, but it returns the right date 
Sun Jan 03 2016 00:00:00 GMT-0700 (MST) 

我不明白是怎么回事。 1990年1月3日星期日和11月11日是星期天。为什么说星期六?

+2

在我的机器都返回0。 – ppasler

+0

在我的机器也返回0 新的日期(“1990年11月11日”)。getDay()返回新的日期(“2016年1月3日” ).getDay() return 0 – CommonPlane

+0

在我的情况下都返回0。检查这个https://jsfiddle.net/yzyqruyc/ – amulya349

回答

1

当然,你的要求是1990-11-11是星期天是真实的,但你要明白,JavaScript的Date对象:

  • 把手时间以及日期
  • 是时区的感知
  • 是设计不好,而且反直觉

你的自己的测试说明这一点:

new Date('1990-11-11').getDay() // returns 6 
> new Date('1990-11-11') 
Sat Nov 10 1990 17:00:00 GMT-0700 (MST) 

什么情况是,constructor assumes local time or UTC depending on the syntax used

注:图中日期被称为一个以上的 参数的构造,为指定的参数代表本地时间。如果UTC为 ,则使用具有相同参数的新Date(Date.UTC(...))。

注:与Date构造日期字符串的解析(和 Date.parse,它们是相同的)强烈劝阻由于 浏览器的差异和矛盾。仅支持RFC 2822格式 字符串。对ISO 8601格式的支持在 中有所不同,只有日期的字符串(例如“1970-01-01”)被视为UTC,而不是 本地。

...而你的语法使它成为UTC。但many others methods假设本地时间:

的getDay()方法返回星期,根据当地的时间,其中0表示周日在指定的日期 。

+0

我认为这个答案描述了最好的情况。谢谢阿尔瓦罗。 – magreenberg

+0

设计确实看起来笨重和用户不友好,但公平地说,日期本质上是复杂的。直到您开始详细使用用例,并且在具有不同日光节约惯例的不同位置,您才会完全理解这一点。 JS的实现在逻辑上是一致的,尽管它显得很奇怪。就像这么多的软件一样,关键是试图进入开发人员的脑海。 –

+1

@RobLyndon JavaScript日期处理确实非常全面和强大,但API非常混乱(当我抱怨设计时,这就是我的意思)。我的意思是......基于零的月份?具有三种不同签名的构造函数,其中大部分的行为会根据值的格式和浏览器配置而有所不同? 'getFullYear()'被添加到修复Y2K问题? –

0

getDay返回日索引(从0到6),其中0是星期日。 https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Date/getDay

返回值: 对应星期给定日期,按照本地时间的整数:0代表星期日,1代表星期一,2表示星期二,依此类推。

更新: 新日期构造函数返回这些日期的不同时间值。

new Date('2016-1-3') ==> Sun Jan 03 2016 00:00:00 GMT+0100 (CET)

new Date('1990-11-11') ==> Sun Nov 11 1990 01:00:00 GMT+0100 (CET)

,由于某种原因,第一个被解释为周六你的机器上。 对不起,不能够帮助更多

UPDATE2:

使用两位数字月/日要规范的结果。 例子:

(new Date('2016-01-03')).getDay() ==> 0

getDay

+0

清楚getDay()是如何工作的,但是OP得到错误的数字。 – ppasler

+1

OP在问题中指出两者的预期结果都是0,因为它们都是星期日。这意味着OP知道该功能的功能。 – UnholySheep

3

的一个,这是错误的是,周日返回的一个,那一定是因为格式不正确。 1990-11-11被解释为00:00:00 UTC时间11日午夜,这是周六在您所在时区的第10个星期五下午5点。

如果您使用getUTCDay(),那么您应该在两个日期都获得0

new Date('1990-11-11').getUTCDay() // returns 0 
new Date('2016-01-03').getUTCDay() // returns 0 
+0

我完全同意这个答案。很显然'2016-1-3'不是ISO格式。你会认为无效格式会抛出错误,但我想这只是JavaScript。使用getUTCDay()将返回正确的值。现在我可以去睡觉了。感谢大家! – magreenberg

+0

@ magreenberg - 只有一种“有效”格式。实现可以随意做任何不符合要求的事情。 – RobG