【问题标题】:How to get time changed from utc to the chosen timezone in moment.js?如何将时间从UTC更改为moment.js中选择的时区?
【发布时间】:2020-03-09 00:26:15
【问题描述】:

假设我有这样的约会:

"2000-01-01T01:00:00Z"

它位于 UTC 时区。我想将时间移动到Europe/Copenhagen 时区,这样它就会是"2000-01-01T02:00:00"

我想用moment-timezone 来做。但是问题是它总是使用我的本地时区(不是Europe/Copenhagen)。我尝试了多种方法,例如:

const date = '2000-01-01T01:00:00Z';
return moment(date).tz('Europe/Copenhagen').format('YYYY-MM-DDTHH:mm:ss');

但参考点仍然是我的本地时区。我根本不希望它使用我的本地时区。如何实现?

【问题讨论】:

  • 您能否澄清“参考点是我的本地时区”的意思?上面的代码返回我期望的字符串,如果你将“Europe/Copenhagen”更改为“America/Los_Angeles”,它会返回“1999-12-31T17:00:00”,正如我所期望的那样。我不确定您在这里的期望与您实际看到的。
  • @JonSkeet 我在 Quatar 时区。上面的代码为我返回“2000-01-01T04:00:00”(考虑到我的本地浏览器时区)。它应该返回“2000-01-01T02:00:00”(哥本哈根时间)。
  • 好的,所以我怀疑是 moment(date) 部分没有考虑 Z。

标签: javascript datetime timezone momentjs moment-timezone


【解决方案1】:

我尝试了两种选择。

时区由日期末尾的“Z”表示

第一个喜欢你的人:

moment('2000-01-01T01:00:00Z').tz('Europe/Copenhagen').format('YYYY-MM-DDTHH:mm:ss');

第二个比较棘手:

moment.tz('2000-01-01T01:00:00Z', 'UTC').tz('Europe/Copenhagen').format('YYYY-MM-DDTHH:mm:ss');

我明白了:

2000-01-01T02:00:00

有两个选项。你用的是什么版本的moment?

【讨论】:

  • "时刻-时区": "^0.5.5"
  • 特别是'0.5.25'
  • 你能把你的解决方案放到 plunker/jsfiddle 中吗?我无法复制这个。
【解决方案2】:

根据您对问题的评论:

我在 Quatar 时区。上面的代码为我返回 '2000-01-01T04:00:00' ...

这只会在以下情况之一发生:

  • 无论位置如何,您实际上都是从 UTC 转换为卡塔尔的时区:

    moment("2000-01-01T01:00:00Z").tz('Asia/Qatar').format('YYYY-MM-DDTHH:mm:ss')
    //=> "2000-01-01T04:00:00"
    
  • 您在卡塔尔,刚刚转换为当地时间:

    moment("2000-01-01T01:00:00Z").format('YYYY-MM-DDTHH:mm:ss')
    //=> "2000-01-01T04:00:00"
    
  • 您已经加载了 moment 和 moment-timezone 的脚本,但尚未加载任何时区数据。在这种情况下,您将在调试控制台中收到一条错误消息,指出 Moment Timezone has no data for <zone name> ...

    在这种情况下,时区转换不能发生,因此它的行为与上述条件中的代码相同。

    不要加载moment.timzone.js,而是使用包含时区数据的文件之一,例如moment-timezone-with-data-10-year-range.js。见these docs

我怀疑这是最后一个。

【讨论】:

    猜你喜欢
    • 2016-02-07
    • 2018-08-07
    • 2017-04-04
    • 1970-01-01
    • 1970-01-01
    • 2016-01-24
    • 2016-05-24
    • 2020-08-31
    • 1970-01-01
    相关资源
    最近更新 更多