【问题标题】:Preserve time but convert to another timezone保留时间但转换为另一个时区
【发布时间】:2014-12-02 11:10:00
【问题描述】:

我正在开发一个应用程序,允许用户在其他时区创建日期/事件,所以我需要转换类似

2014-12-01T19:00:00.000Z 到任何特定时区,例如“美国/凤凰城”。

我正在用时刻来处理它:

moment.tz(dt, 'America/New_York').format();

这输出: 2014-12-01T14:00:00-05:00 这不是我想要的。

我要做的就是更改时区而不是时间,使其变为 2014-12-01T19:00:00-05:00

也许我可以在转换时区之前添加 5 的偏移量(取决于区域),以便它保持相同的时间?也许有更好的方法?

谢谢,詹姆斯

【问题讨论】:

    标签: javascript datetime timezone momentjs


    【解决方案1】:

    您应该认识到,字符串中的Z 意味着时间戳应该被解释为UTC。因此,如果您将其更改为不同的偏移量而不相应地调整时间,您实际上是在选择一个 不同 时刻。通常,这不是正确的做法。

    通过调整时间以匹配时区的偏移量,Moment 正在做正确的事情。它将输入字符串解释为 UTC,然后将其调整为提供的时区。

    听起来您想忽略Z 并将时间视为已经处于特定时区。更改它的最佳位置是最初生成字符串的任何位置。如果不是 UTC,则不应将 Z 首先放在末尾。

    但是,您当然可以在 JavaScript 中去掉它并得到您想要的结果。

    var s = "2014-12-01T19:00:00.000Z";
    
    moment.tz(s.replace(/Z$/,''), 'America/New_York').format();
    

    【讨论】:

      【解决方案2】:

      你可以使用像这样的矩方法:

      例子:

      moment.tz(dt, 'America/New_York').startOf('day').hour(dt.get('hour')).minute(dt.get('minutes')).format()
      

      这将打印与 dt 变量相同的小时和分钟。

      希望对你有帮助

      【讨论】:

      • 当然可以,但是它会损失精度,而且它实际上可能会在不同的日历日期结束。
      猜你喜欢
      • 1970-01-01
      • 2012-10-27
      • 2018-07-15
      • 2012-01-30
      • 2015-05-06
      • 2011-07-13
      • 1970-01-01
      • 2015-11-05
      • 2013-02-18
      相关资源
      最近更新 更多