首页 > 解决方案 > 从 1970 年 1 月 1 日以来的天数创建一个 JavaScript 日期对象

问题描述

我在互联网上找到了许多从秒或毫秒转换为 JavaScript 日期的示例,但只有少数几个用于从天转换为 Date 对象。当我在自己的代码(使用自己的值)中尝试这些示例时,我无法复制它们的结果。

我的 API 返回一个整数值,表示自 UNIX 纪元以来的天数。我需要找到一种方法将其转换为 JavaScript 日期对象,以便我可以以人类可读的格式显示它。

例如:

new Date(18521 * 86400 * 1000)
// multiply by 86400 (seconds in a day), then by 1000 to convert to milliseconds.

在撰写本文时,日期为 2020 年 9 月 17 日 MMDDYYYY,距 UNIX 纪元已过去 18522 天。但是,当我尝试使用带有一些数学运算的日期构造函数(如上所述)检索昨天的 UNIX 日期 18521 时,我得到的日期不正确:2020 年 9 月 15 日。我希望得到(2020 年 9 月 16 日),因为我只减去了一天,但由于某种原因,情况并非如此。

我在这里做错了什么吗?我应该改变什么才能使我的代码工作?

标签: javascriptdate

解决方案


你这样做的方式是正确的。ECMAScript UTC 日总是有 8.64e7 毫秒,ECMASCript 和 Java 具有相同的纪元。您这样做的方式将 UTC 日期设置为正确的值(这是正确的方法),而不是本地日期。默认toString显示本地日期,因此如果主机设置为负偏移量,它将提前一天显示。

因此,请改为获取 UTC 日期:

new Date(18521 * 8.64e7).toISOString() //2020-09-16T00:00:00.000Z.

如果您想使用本地日期执行此操作,则为 1970 年 1 月创建一个日期,并将“日期”参数设置为天数加 1(因为 1 月从 1 开始,而不是 0):

console.log('UTC  : ' + new Date(18521 * 8.64e7).toISOString() +
  '\nLocal: ' + new Date(1970, 0, 18521 + 1).toDateString());


推荐阅读