首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么js以某种格式从日期对象中减去一天?

问为什么js以某种格式从日期对象中减去一天?
EN

Stack Overflow用户
提问于 2015-02-05 12:48:54
回答 2查看 3.7K关注 0票数 4

我从数据库中获得以下格式的日期:

yyyy dd

当我使用此字符串创建javascript对象时,它将在日期前一天生成。

您可以在您的控制台中测试这一点:

代码语言:javascript
复制
var d = new Date("2015-02-01"); 
d

你将得到1月31日!我检验了许多理论,但没有人回答这个问题。

  • 这一天不是以零为基础的,否则它将是2月00,而不是1月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:“如何从数据库中更改日期的格式”不是我要问的问题,这就是为什么我不会在这里放置任何db信息。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-02-05 14:39:21

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

因此,当您阅读它时,本地化时间可能因浏览器而异。

按时区偏移量计算。

如果您将日期强制为UTC,则可以添加本地偏移量。

想要在本地有时间保证:

代码语言:javascript
复制
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格林尼治时间-0500(东部标准时间)

抵消将是任何当地时间。

代码语言:javascript
复制
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. 
票数 3
EN

Stack Overflow用户

发布于 2015-02-05 21:36:13

在javascript中,Date对象在内部表示为自1970年1月1日以来的毫秒数00:00:00UTC。因此,没有将其视为正常意义上的“日期”,而是尝试将日期对象视为由整数(没有时区)表示的“时间点”。

当使用字符串构造Date对象时,实际上只是调用解析函数。大多数日期时间格式(包括ISO 8601)允许您降低日期字符串的精度。

为了降低精度,可以从任何日期和时间表示中删除任意数量的值,但从最小到最重要的顺序。

例如,2015-02-01将代表2015年2月1日的一天。

这导致javascript陷入两难境地,因为日期对象总是精确到毫秒。Javascript不能存储减少的精确日期,因为它只是1970年1月1日以来毫秒的整数。因此,它做的第二个最好的事情是假设午夜的时间(00:00:00) (如果没有指定),如果没有指定UTC的时区。

所有有效的javascript实现都应该给出相同的结果为此

代码语言:javascript
复制
var d = new Date("2015-02-01");
alert(d.getTime());

1422748800000

当将日期输出到某个调试器(通常是不清楚的)或使用getter方法(因为使用了本地时区)时,就会出现逐日输出问题。在浏览器中,这将是操作系统时区。任何“西方”的格林威治标准时间可能会看到这个问题,因为他们有一个负的UTC抵消。请注意,如果您真正感兴趣的是日期而不是时间点,也有使用UTC时区的UTC等价函数。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28344408

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档