【问题标题】:Moment.js Timezone - CONSIDER a date/time to be in a different timezone when outputtingMoment.js 时区 - 输出时将日期/时间考虑在不同的时区
【发布时间】:2016-04-20 15:48:03
【问题描述】:

我知道这似乎是一个直截了当的问题 - 但尽管 Moment.js 和 moment timezone 是获取/设置和格式化日期的非常强大的工具..

我在将应用程序捕捉到单个时区时遇到问题。

我想要的是让用户从日期/时间选择器中进行选择 - 并将其作为 UTC 中的 unix 时间戳发送。但日期/时间选择器必须被视为 BST。

换句话说,即使您是从国外使用该网站,您选择的日期/时间也应该是您在英国选择的 UTC 值。

var local = moment(dateTime).unix();
var london = moment(dateTime).tz('Europe/London').unix();
var berlin = moment(dateTime).tz('Europe/Berlin').unix();

所有 3 个变量将等于同一台机器上的 SAME UTC 时间戳,但在另一台运行在不同时区的机器上的时间戳不同。

想一想...如果我的日期/时间是周六下午 3 点...伦敦的 UTC 与柏林的 UTC 不同,因为它会比柏林早一小时。

如何强制将日期/时间视为特定时区?

谢谢:-)

【问题讨论】:

  • 您在很大程度上混淆了术语。 UTC 在任何地方都是相同的。它不会因时区而改变。当地时间改变,但不是 UTC。关于您提供的代码,您需要显示dateTime 的示例值。是字符串、数组、日期对象、时刻对象等吗?
  • ^Matt 在这里提出了一个很好的观点。请记住,unix 时间戳始终是 UTC。我认为您想要伦敦时间,而不是 UTC。

标签: javascript datetime momentjs


【解决方案1】:

假设 dateTime 是一个 ISO8601 字符串,并且您希望日期始终处于欧洲/伦敦时区,您只需要:

moment.tz(dateTime, 'Europe/London').unix()

这告诉 moment 将该时间解释为伦敦时间,前提是它没有指定的偏移量。如果它有偏移量,它将从偏移量的时间转换为伦敦时间。

所以,对于在美国/芝加哥的我来说,你可以看到这样的效果:

//unix timestap in london time
moment.tz('2016-12-30', 'Europe/London').unix()
1483056000
//parse that timestamp back to my local time
moment.unix(1483056000).format()
"2016-12-29T18:00:00-06:00"

请注意,由于夏令时,伦敦有多个偏移量。我想这就是你想要的。

如果您希望它始终保持 +0 的固定偏移量,那么您可以使用 UTC:

moment.utc(dateTime)

【讨论】:

  • 你摇滚!我可能已经在网上找到了这个,但是在数小时的日期/时间故障之后,大脑因多次搜索而死!
  • 我打算在 moment-timezone 网站上为此添加一些文档。这不是最直观的事情。
  • 谢谢,玛吉。 :)
猜你喜欢
  • 1970-01-01
  • 2019-12-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多