2016-12-28 89 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