首页 > 解决方案 > EJS 文件显示日期不正确(日期落后一号)

问题描述

我有一个 ejs 文件显示来自我的节点服务器和猫鼬数据库的日期。在服务器和数据库中,日期是正确的,我为日期设置了一个 console.log,它返回:

2020-06-10T00:00:00.000Z

6月10日,如期而至。但是,当我将它显示在 ejs 文件中时,它显示为 6 月 9 日:

<p><%= ticket.due_date.toDateString() %></p>

它在页面上显示为

Tue Jun 09 2020

当我使用 moment 重构发送到 ejs 文件的日期格式时,这似乎也是一个问题:

        console.log(ticket.due_date);
        date = moment(ticket.due_date).format("YYYY-MM-DD");
        console.log(date);

这输出到控制台中:

2020-06-10T00:00:00.000Z
2020-06-09

是否有一些我遗漏的格式问题,或者它是系统固有的,如果是这样,我如何简单地在 ejs 文件中添加一天以使其正确?谢谢你。

标签: javascriptnode.jsmongooseejs

解决方案


ADate不是字符串;它是一个封装了某个时刻的对象(在内部,一个很大的数字)。它不包含任何其他有趣的细节,例如您用来创建它的字符串最初是如何格式化的。因此,当您输出一个Date with 时.toDateString(),将根据 JavaScript 规范简单地为时间戳输出一个字符串.toDateString()

有许多有效的方法可以将 a 格式化Date为字符串。我会浏览Date. 例如,一个选项.toISOString()似乎是您期望的格式。如果您想以多种格式输出用户友好的日期,则需要查看Moment.js.

更新

您似乎对日期有误解。像示例这样的 ISO 8601 日期2020-06-10T00:00:00.000Z表示 UTC 午夜(又名 GMT、祖鲁语等)。aDate不代表本地日历日期,它代表一个时刻,特别是自 1970 年 1 月 1 日 UTC 以来的毫秒数。这意味着当你处理 JavaScript 日期时,你应该有意识地构造它们,并适当地理解它们代表一个时间点。例如,如果您希望日期反映当地时区的午夜,您可以使用构造函数:

const date = new Date(2020, 5, 10);

...并且当您输出日期时,您应该记住查看时间的人可能在不同的时区,因此日期可能不会反映为完全相同的东西。

如果您想处理日历日期而不是时间戳(这将是一个更好的名称Date),那么您可以在整个过程中使用 UTC 日期,并确保在输出字符串时指定您希望使用格式化日期UTC 时间偏移量。或者,如果您不想要时间戳的任何语义,您可能想要坚持使用字符串。


推荐阅读