当前位置: 首页 > 知识库问答 >
问题:

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

百里伟
2023-03-14

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

日期格式

当我使用这个字符串创建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日星期三
    • Date("2015-08-02")=Sat Aug 01 2015
    • 如果这是真的,日期将是2015年2月8日
    • 日期("02/01/2015")=2015年2月1日

    我的结论是,js这样做是有目的的。我试图研究“为什么”,但找不到解释。为什么js以这种方式构建日期,但只使用这种格式?有没有办法解决这个问题,或者我必须确定日期,然后把日期定在第二天?

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

共有2个答案

宗政霄
2023-03-14

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

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

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

例如2015-02-01代表2015年2月1日。

这给javascript带来了一个难题,因为日期对象总是精确到毫秒。Javascript无法存储精度降低的日期,因为自1970年1月1日起,该日期仅为毫秒整数。因此,它做了下一件最好的事情,即假设未指定的时间为午夜(00:00:00),如果未指定,则假设时区为UTC。

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

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

1422748800000

将日期输出到某些(通常不清楚)调试器或使用getter方法时,会出现1天以外的问题,因为使用的是本地时区。在浏览器中,这将是您的操作系统时区。格林威治标准时间以西的任何人都可能会看到这个问题,因为他们的UTC偏移量为负。请注意,如果您真正感兴趣的是表示日期而不是时间点,那么也有使用UTC时区的UTC等效函数。

钱德元
2023-03-14

一些浏览器将部分日期字符串解析为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值:(当地日期)2月01 2015 00:00:00日(美国东部标准时间)

偏移量将以当地时间为准。

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. 
 类似资料:
  • 问题内容: 我正在从一个字符串中解析两个日期,如下所示: 我需要做的是找出这两个日期之间的区别,例如: = 8天2小时36分钟21秒 ^这是我需要的两个日期/时间 我相信我需要解析格式并将其转换为另一种格式,然后减去两者之间的差并进行数学运算以得出之间的天/小时/分钟/秒 问题答案: 与其他回答者试图暗示的相反,在标准Java SE中,计算两个日期之间的差异并不是那么简单。 您的第一步确实是将这些

  • 问题内容: 我正在寻找使用SQL将一种日期格式转换为另一种格式。我正在使用用于SQLite的数据库浏览器,日期存储在“ TEXT”类型的列中。 这是当前格式的2个示例: 2017/4/17上午9:09:09 2017/10/4下午10:21:13 请注意,在当前的日期,月份和小时格式中,如果只有一位数字,则当前不会以前导“ 0”填充。他们也把月份放在第一位,然后是日期,然后是年份。这两个示例应转换

  • 我有一个输入日期作为字符串,格式为dd/MM/yyyy 现在我想把它转换成日期对象,格式为yyyy-MM-dd 目前我正在做 输入为:“2013年4月2日” 但我的约会对象是… 所需输出为:2013-02-04(不是字符串,而是日期对象)

  • 问题内容: 我有一个对象。减去一天的最佳方法是什么? 问题答案: 你可以使用对象:

  • 问题内容: 有没有一种简单的方法可以将一种日期格式转换为PHP中的另一种日期格式? 我有这个: 但是我当然希望它返回一个当前日期,而不是返回“黎明”。我究竟做错了什么? 问题答案: 第二个参数必须是正确的时间戳(自1970年1月1日以来的秒数)。您正在传递一个字符串,date()无法识别。 您可以使用 strtotime() 将日期字符串转换为时间戳。但是,即使strtotime()也无法识别格式

  • 我想知道在FreeMarker中从今天的日期减去日期的最好方法是什么? 我有一个用户的注册日期在这种格式:2015-06-15 05:12:35.890,我要做的是得到他们注册到现在之间的年数。(全年,不需要1年6个月/1.5年为例) 谁能告诉我做这件事的最好方法吗?