Moment.js 格式不正确

Moment.js incorrect formatting

Moment 突然开始错误地格式化日期。就像,彻底改变他们。我不明白为什么。我制作了一个简短的视频,所以你可以看到这里发生了什么:https://youtu.be/WPLDiiWsfAo

下面是一些运行错误的代码:

activeProject() {
  let proj = { ...this.$store.state.activeProject };
  if (proj.Start) {
    debugger;
    proj.Start = moment(proj.Start).format("MM/DD/YYYY");
    proj.End = moment(proj.End).subtract(1, "days").format("MM/DD/YYYY");
    return proj;
  } else return {};
},

proj.Start = "2021-03-01T00:00:00.000Z" 输出 02/28/2021
proj.End = "2021-03-08T00:00:00.000Z" 输出 03/06/2021

所以用moment格式化后,proj.Startproj.End休息了1天。为什么要这样做?

在 ISO 8601 标准中,the Z means UTC (Coordinated Universal Time),实际上是英国伦敦时间。

如果您在英国伦敦以西的时区(像我一样)并且伦敦的当前时间刚刚过去 00:00(就像我写这个答案的现在),您的问题将在下面重现。该片段将在同一时刻为位于伦敦以东时区的人输出正确的值。

let proj = {Start: "2021-03-01T00:00:00.000Z", End:"2021-03-08T00:00:00.000Z"}

proj.Start = moment(proj.Start).format("MM/DD/YYYY");
proj.End = moment(proj.End).subtract(1, "days").format("MM/DD/YYYY");

console.log(proj.Start, "expected: 03/01/2021")
console.log(proj.End, "expected: 03/07/2021")
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.29.1/moment.min.js"></script>

通知现在没有 Z...

let proj = {Start: "2021-03-01T00:00:00.000", End:"2021-03-08T00:00:00.000"}

proj.Start = moment(proj.Start).format("MM/DD/YYYY");
proj.End = moment(proj.End).subtract(1, "days").format("MM/DD/YYYY");

console.log(proj.Start, "expected: 03/01/2021")
console.log(proj.End, "expected: 03/07/2021")
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.29.1/moment.min.js"></script>

所以你的问题是指定一个相对于 UTC 的 date/time,但它似乎不是你想要的。

您的解决方案是从使用的数据中删除最后的 Z...

moment(...) is local mode. Ambiguous input (without offset) is assumed to be local time. Unambiguous input (with offset) is adjusted to local time.

Moment documentation