EJS 文件显示日期不正确(晚一天)

EJS File displaying date incorrectly (day is one behind)

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

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 文件中添加一天以使其正确?谢谢。

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

的 JavaScript 规范简单地输出时间戳字符串

有许多有效的方法可以将 Date 格式化为字符串。我会查看 Date. For example, one option is .toISOString() which seems to be the format you're expecting. If you want to output user-friendly dates in a multitude of formats, you'll need to look to libraries like Moment.js.

上的文档

更新:

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

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

...当你输出日期时,你应该记住,查看该时刻的人可能处于不同的时区,因此日期可能不会反映完全相同的东西。

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