使用我创建的时区偏移量初始化一个Moment

dan*_*nny 6 javascript momentjs

我在javascript中使用时刻和时刻 - 这个部分是我见过的最不直观的API之一.

我希望如此:

moment("2015-12-14T04:00:00Z").utcOffset()
Run Code Online (Sandbox Code Playgroud)

将是一个纯函数并返回参数中包含的偏移量,即0.但是它隐式将其转换为我的本地时区偏移量(PST),所以这将返回-480为什么?我问我刚刚创建的对象偏移了什么,而不是我目前所处的偏移量.就像我写了一个api,其中调用User.find(123).name()返回你的名字而不是用户的名字123.

无论如何,我能做到

moment("2015-12-14T04:00:00Z").tz("utc").utcOffset()
Run Code Online (Sandbox Code Playgroud)

但我的日期时间字符串是动态的,所以我不知道时区.

我怎样才能得到我所期望的行为,在传入的字符串中包含的时区偏移量中的js中的时刻?

Mat*_*int 14

使用parseZone保持,因为它是在通过了偏移.

moment.parseZone("2015-12-14T04:00:00Z")
Run Code Online (Sandbox Code Playgroud)

至于"为什么?" 你问题的一部分:

  • moment(...)是本地模式.模糊输入(无偏移)假定为本地时间.明确的输入(带偏移)调整为当地时间.
  • moment.utc(...)是utc模式.模糊输入假定为UTC.明确的输入调整为UTC.
  • moment.parseZone() 保持输入区域的传入.如果输入不明确,则与本地模式相同.
  • moment.tz(...) 使用moment-timezone插件可以解析特定时区的输入.

请记住,时刻必须与各种各样的投入相抗衡.

还要记住,时区和时区偏移是两个不同的事情.抵消-08:00并不一定意味着您处于美国太平洋时区.

  • 是的,可能有一些我没有考虑的东西或历史包or之类的东西。将基本形式的moment()设为本地模式似乎是一个奇怪的选择,对于默认行为,parseZone()行为似乎更加自然。感谢您的解释 (2认同)
  • 仅供参考,这个话题实际上是我第一次参与moment.js的方式.有关历史记录,请参阅[#611](https://github.com/moment/moment/issues/611)和[#887](https://github.com/moment/moment/issues/887). (2认同)