javascript - 从 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 日),因为我只减去了一天,但由于某种原因,情况并非如此。
我在这里做错了什么吗?我应该改变什么才能使我的代码工作?
解决方案
你这样做的方式是正确的。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());
推荐阅读
- php - 如果在字符串中找到图像标签,如何停止函数
- c - 当我添加了 4 个元素时,为什么数组的长度是 3?
- amazon-web-services - 为每个部署环境传递 CDK 上下文值
- macos - DriverKit 中可以将哪些选项传递给 IOService::Terminate
- github - 当有人对我的提交发表评论时,如何停止从 GitHub 收到电子邮件?
- xml - 下载字符串的编码问题(UTF-8、ISO-8859-1、FSharp.Data)
- html - 滚动时,将元素从屏幕底部转换到屏幕中心并保持居中,直到该部分的底部接触视口的底部
- python - 在熊猫中达到某个值时的列长度
- c# - 为什么是列表
Tasks.Run( lambda ) 比 List 快 只是直接的异步方法调用? - java - 给定长度的平方和的递归查找顺序