Moment&Timezone转换本地时间失败

时间:2019-04-22 19:06:47

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

这是在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

1 个答案:

答案 0 :(得分:3)

几件事:

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

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

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

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

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

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

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

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