【问题标题】:Moment & Timezone convert local time fails时刻和时区转换本地时间失败
【发布时间】:2019-09-11 23:04:37
【问题描述】:

这是在 NodeJS 上基于 Ionic 的混合应用程序中。

尝试将用户输入指定的本地时间转换为另一个时区,但失败了:

static MTL_local_time_to_server(aDateTime:moment.Moment):moment.Moment{
    console.log(aDateTime.format('MMMM Do YYYY, h:mm:ss a'));

    const localTime:moment.Moment = momenttz.tz(aDateTime, momenttz.tz.guess());
    console.log(localTime.format('MMMM Do YYYY, h:mm:ss a'), momenttz.tz.guess());
    const returnTime:moment.Moment = momenttz(localTime).tz("Europe/Berlin");
    console.log(returnTime.format('MMMM Do YYYY, h:mm:ss a'));
    return returnTime;
}

打印

April 22nd 2019, 12:00:00 am 
April 22nd 2019, 12:00:00 am America/Los_Angeles 
April 22nd 2019, 9:00:00 am

【问题讨论】:

  • 可能与this question 相关,如果localDateTimeZ 结尾确实会被视为UTC 并仅使用moment.tz(input, zone) 进行转换。有关详细信息,请参阅链接的已接受答案及其 cmets。
  • @VincenzoC 感谢您的建议,但删除 Z 仍然失败,见上文。

标签: node.js typescript timezone momentjs moment-timezone


【解决方案1】:

一些事情:

  • 您已将moment.tz 的输出键入为string,但它实际上是Moment 对象。

  • 当您在 Moment 对象上调用 JSON.stringify 时,它会返回 .toISOString() 的输出,该输出始终采用 UTC。 (Z 表示 ISO 8601 格式的 UTC。)

  • 不清楚您的输入是string 还是Date 对象。如果是string,那么Z 表示UTC,所以它总是被解释为UTC。如果它是Date 对象,则将使用该Date 对象表示的时间点——这取决于您如何构造Date 对象。无论哪种方式,您显示的值都是基于 UTC,而不是本地时间。

  • 目前尚不清楚您要完成什么。从您的变量名称来看,您似乎正在尝试将localDateTime 转换为localTime,如果它们都是“本地”,则逻辑上会给出相同的值。

    • 如果您尝试将值从本地时间转换为柏林时间,那么:

      moment(yourInput).tz('Europe/Berlin')
      
    • 如果您尝试将值从洛杉矶时间转换为柏林时间,那么:

      moment.tz(yourInput, 'America/Los_Angeles').tz('Europe/Berlin')
      
    • 如果您尝试将值从 UTC 转换为本地时间,则根本不需要时刻时区:

      moment.utc(yourInput).local()
      
  • 如果您需要字符串输出,那么您应该调用format 函数来生成字符串。您在此处显示的内容看起来像是在记录 Moment 对象而不是字符串。

【讨论】:

  • 感谢您的指点,我会检查一下。在我的 IDE 中 moment.tz 似乎返回 any,而不是特定类型。因此我迷路了。我会试试你的建议。
  • 是的,但我只导入了 moment-timezone,而不是 moment 的类型。
  • 您可能还想考虑使用Luxon 而不是 Moment。它包含时区支持,专为现代开发工作流程而设计。
  • 我编辑了我的问题,使其更清晰。基本上是在做你列出的双重转换。
  • 我看到了编辑,但仍不清楚您要尝试完成什么。您说“用户输入指定的本地时间”,但您提供了一个时刻对象作为输入。你是如何构造那个对象的? complete 的例子对你很有帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-05
  • 2018-11-28
  • 1970-01-01
相关资源
最近更新 更多