javascript - 为什么js会从一个特定格式的Date对象中减去一天?

标签 javascript date

我以这种格式从数据库中获取日期:

yyyy-mm-dd

当我使用这个字符串创建一个 javascript 日期对象时,它会在日期前一天构建。

您可以在控制台中进行测试:

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

您将获得 1 月 31 日!我测试了很多理论,但没有一个能回答问题。

  • 日期不是从零开始的,否则它会给出 Feb 00,而不是 Jan 31
  • 它不是在执行数学方程式,即从月份和/或年份中减去日期
    • 日期 (2015-02-01) = 1969 年 12 月 31 日,星期三
    • 日期("2015-01") = 2014 年 12 月 31 日星期三
  • 不会混淆月份的日期
    • 日期("2015-08-02") = 2015 年 8 月 1 日星期六
    • 如果这是真的,日期应该是 2015 年 2 月 8 日
  • 如果您使用不同的格式创建日期,它可以正常工作
    • 日期("02/01/2015") = 2015 年 2 月 1 日

我的结论是js是故意的。我曾尝试研究“为什么”,但找不到解释。 为什么 js 以这种方式构建日期,但只能使用这种格式?有没有办法解决这个问题,还是我必须构建日期,然后将其设置为第二天?

PS:“如何从数据库中更改日期格式”不是我要问的,这就是为什么我不在此处放置任何数据库信息的原因。

最佳答案

有些浏览器将部分日期字符串解析为 UTC,有些浏览器解析为本地时间,

所以当你阅读它时,本地化时间可能因浏览器而异

按时区偏移。

如果您可以强制日期为 UTC 并添加本地偏移量

希望时间保证本地:

1. set UTC time:    

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


2. adjust for local:

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

D 的值:(本地日期) 2015 年 2 月 1 日星期日 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. 

关于javascript - 为什么js会从一个特定格式的Date对象中减去一天?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28344408/

相关文章:

java - 计算时差错误

R日期时间转换

mysql - 将facebook用户生日存储到mysql

python - mpld3 无法在 x 轴上正确显示日期

javascript - Angularjs 保留局部变量

javascript - 错误: Cannot find module '@kyleshockey/object-assign-deep'

javascript - react 滚动到文本区域的底部

javascript - 立即执行函数和使用关键字 new 有什么区别?

javascript - 堆叠的 div 都使用 jquery .click 激活

java - 从 jFreeChart 毫秒到 java.util.Date