2015-02-05 90 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