【问题标题】:Moment.js incorrect formattingMoment.js 格式不正确
【发布时间】:2021-03-02 01:05:12
【问题描述】:

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

所以在格式化之后,proj.Startproj.End 需要 1 天的时间。为什么要这样做?

【问题讨论】:

  • 我可以向你保证,那一刻并没有“突然开始错误地格式化日期”。是您的代码不正确。不要责怪没有很好证据的高度使用的非常可靠的内置模块。
  • 你看视频了吗?您是要提供任何建议,还是只是为了讽刺并告诉我我做错了?
  • 我需要提到该视频对您的问题很有帮助。请不要将其从 Youtube 中删除...供未来的 SO 读者使用。 ;)
  • 优秀的视频使用!如果你能把它们上传到 SO...

标签: javascript momentjs


【解决方案1】:

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

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

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 的日期/时间,而这似乎不是您想要的。

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

moment(...) 是本地模式。模糊输入(无偏移)被假定为本地时间。明确的输入(带偏移量)调整为本地时间。

Moment documentation

【讨论】:

  • 这更有意义。我只需要找出为什么 Z 被保存到数据中开始,它应该很好。非常感谢!
  • 一个快速的“补丁”可以是:proj.Start = moment(proj.Start.slice(0,proj.Start.length-1).format("MM/DD/YYYY");... 删除那个Z。 ;) 但我建议您寻找关于数据本身的更好解决方案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-21
  • 1970-01-01
  • 2021-09-07
  • 1970-01-01
  • 2016-06-07
  • 1970-01-01
相关资源
最近更新 更多