2015-02-05 66 views
3

我從數據庫中獲取日期的格式如下:爲什麼js從具有特定格式的Date對象中減去一天?

YYYY-MM-DD

當我創建一個使用此字符串一個JavaScript Date對象,它建立日期的前一天。

您可以在控制檯測試:

var d = new Date("2015-02-01"); 
d 

您將獲得1月31日!我測試了很多理論,但沒有人回答這個問題。

  • 這一天是不是從零開始的,否則會給二月00,而不是01月31日
  • 它不執行數學方程式,從一個月和/或一年
    • 日期減去天( 2015年2月1日)=週三1969年12月31日
    • 日期( 「2015-01」)=週三2014年12月31日
  • 這不是混淆了一天的一個月
    • 日期(「2015年8月2日」)=星期六2015年8月1日
    • 如果這是真的日期是2015年2月8日
  • ,如果您使用不同格式的日期,它工作正常
    • 日期( 「2015年2月1日」)= 2015年2月1日

我的結論是JS做這個目的地。我試圖研究'爲什麼',但找不到解釋。 爲什麼js以這種方式構建日期,但僅限於此格式?是否有解決方法,還是必須構建日期,然後將其設置爲第二天? PS:「如何從數據庫中更改日期的格式」並不是我所要求的,這就是爲什麼我不在這裏放置任何數據庫信息的原因。

+0

我不確定,但這可能是一個時區問題? – Phil 2015-02-05 13:05:18

+2

你最後的問題和你的PS互相矛盾。我只是將數據庫結果轉換爲支持格式並將其用於日期。不要添加或刪除日子。至於爲什麼這樣做......也許這樣:給定一個日期字符串「2014年3月7日」,parse()假設一個本地時區,但給定一個ISO格式,如「2014-03-07」它會假設UTC的時區。 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/parse – 2015-02-05 13:12:26

+0

Chrome工作正常。 'new Date(「2015-02-01」);' - >'Sun Feb 01 2015 03:00:00 GMT + 0300(MSK)' – gorpacrate 2015-02-05 13:25:59

回答

2

有些瀏覽器解析部分日期字符串作爲UTC和一些爲本地時間,

所以當你讀它本地化的時間可以從一個瀏覽器中的時區偏移量的不同而不同

可以生效的日期是UTC,並添加本地偏差,如果你

要保證時間本地:d的

1. set UTC time:  

var D= new Date("2015-02-01"+'T00:00:00Z'); 


2. adjust for local: 

D.setMinutes(D.getMinutes()+D.getTimezoneOffset()); 

值:(本地時間) 孫二月01 2015 00:00:00GMT-0500(東部標準時間)

偏移將是什麼是當地時間。

Some differences between browsers when time zone is not specified in a parsed string: 

(tested on Eastern Standard Time location) 

(new Date("2015-02-01T00:00:00")).toUTCString(); 


Firefox 35: Sun, 01 Feb 2015 05:00:00 GMT 

Chrome 40: Sun, 01 Feb 2015 00:00:00 GMT 

Opera 27: Sun, 01 Feb 2015 00:00:00 GMT 

IE 11: Sun, 01 Feb 2015 05:00:00 GMT 

IE and Firefox set the Date as if it was local, Chrome and Opera as if it was UTC. 
+0

我不認爲瀏覽器在這裏不一致。如果您在iso 8601日期字符串中沒有給出時間,則假定爲00:00:00。如果您未在iso 8601日期字符串中提供時區組件,則假定爲UTC。 Js只將日期存儲爲1970年1月1日00:00:00 UTC以來的毫秒數。控制檯輸出的不同之處在於當再次記錄日期時使用的不同操作系統時區。那就是使用本地時區的時候。 – Phil 2015-02-05 18:40:59

0

在JavaScript中,日期對象在內部表示爲自1970年1月1日00:00:00 UTC的毫秒數。因此,不要將它看作一般意義上的「日期」,嘗試將Date對象視爲由整數(不帶時區)表示的「時間點」。

使用字符串構造Date對象時,實際上只是調用parse function。大多數日期時間格式(including ISO 8601)允許您降低日期字符串的精度。

對於降低精度,任意數量的值可以從日期和時間表示的任何 下降,但在順序從最小 最顯著。

例如, 2015-02-01將代表當天2015年2月1日

這對javascript造成了困境,因爲Date對象始終精確到毫秒。由於JavaScript自1970年1月1日以來只有毫秒的整數,因此Javascript無法存儲精確度降低的日期。因此,如果未指定,則會執行下一個午夜時間(00:00:00)的最佳做法,以及時區UTC如果未指定。

所有有效的JavaScript實現應該給予同樣的結果for this

var d = new Date("2015-02-01"); 
alert(d.getTime()); 

1422748800000 

的出乘1天的輸出日期時問題來或者一些(往往不清楚)調試器或使用getter方法,因爲使用本地時區。在瀏覽器中,這將是您的操作系統時區。任何「west」Greenwich Mean Time可能會看到此問題,因爲它們具有負的UTC偏移量。請注意,如果您真的只是表示日期而不是時間點,那麼也有使用UTC時區的UTC equivalent functions