首页 > 解决方案 > 时刻解析区域给出了意想不到的结果

问题描述

const input = '02/02/1700 12:30'
const inputFormat = ['DD/MM/YYYY HH:mm']
const displayFormat = 'YYYY-MM-DDTHH:mm:ss'


console.log(moment(input, inputFormat, true))
console.log(moment(input, inputFormat, true).format())
console.log(moment.utc(input, inputFormat, true))
console.log(moment.utc(input, inputFormat, true).format())
console.log(moment.parseZone(input, inputFormat, true))
console.log(moment.parseZone(input, inputFormat, true).format())
console.log(moment.tz(input, inputFormat, true, 'Asia/Hong_Kong'))
console.log(moment.tz(input, inputFormat, true, 'Asia/Hong_Kong').format())
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.27.0/moment.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment-timezone/0.5.31/moment-timezone-with-data.min.js"></script>

https://jsfiddle.net/y9gtvbdn/

上面的例子 parseZone 给出的结果与 input1700-02-02T12:29:18Z不同'02/02/1700 12:30'。任何人都可以向我解释这个吗?

标签: datetimezonemomentjs

解决方案


一些东西:

  • 不要moment直接登录。始终使用输出函数,例如format
  • 当您在 Moment 中解析时,Moment 在内部调用Date对象的 setter。由于您没有通过秒或毫秒,因此永远不会调用设置器。如果您确实有几秒钟,您会看到它们按预期设置为零。
  • 他们不在这种情况下的原因是存在一个长期存在的浏览器错误,其中Date对象构建在1883-11-18T12:03:57.999Z. 请参阅此评论和相关问题。这不是一个瞬间错误,而是一个 JavaScript 浏览器的怪癖。这仅对非常早的日期很重要。
  • parseZone专门用于当输入包含时区偏移量时使用 - 数字-07:00或 a Z(表示 UTC)。您的示例输入字符串都没有。

推荐阅读