moment.js无法将utc日期转换为本地日期

时间:2016-10-06 14:39:34

标签: javascript date momentjs

我有以下日期的utc格式,我想转换并显示为本地日期时间。

// utc
date = 'Thu Oct 27 2016 07:00:00 GMT+0100 (GMT Standard Time)';

// convert to local
moment.utc(date).local().format("ddd MMM DD YYYY HH:mm:ss");

使用上述内容的预期结果应为:

Thu Oct 27 2016 08:00:00

但实际结果显示如下,即时间不变?

Thu Oct 27 2016 07:00:00

2 个答案:

答案 0 :(得分:3)

一些事情:

  • 您的输入是非标准格式的字符串。您可能通过获取Date对象并调用.toString()函数来获得它,但这并不意味着它适合于按时解析。如果你查看调试控制台,你会发现一条警告消息,因为你传入了一些本身不能理解的东西,因此它将它传递回Date构造函数。请参阅the user guide,其中说明了在进行自定义输入时必须传递格式说明符。

  • 您的输入包含+0100的时区偏移量。这意味着7:00时间是UTC + 1,相当于UTC时间6:00。这是您首次使用moment.utc(yourInput)

  • 解析时的值
  • 然后在调用local()函数时将6:00 UTC转换回本地时间。那是你看到的7:00 UTC + 1。

如何解决这个问题取决于您实际想要做什么。你说你期待8:00 UTC,但是你提供的输入没有意义,因为7:00 (+1) == 6:00 (+0)

如果你的意思是你想断言原始时间值确实是UTC,而不是UTC + 1,即使它在你的输入中,那么提供一个只包含你关心的部分的格式字符串。 Moment的默认松散解析模式将忽略任何无关的内容。

date = 'Thu Oct 27 2016 07:00:00 GMT+0100 (GMT Standard Time)';
moment.utc(date, 'ddd MMM DD YYYY HH:mm:ss').local().format("ddd MMM DD YYYY HH:mm:ss");

换句话说,此处的输入日期仅为Thu Oct 27 2016 07:00:00,其余部分将被忽略。您通过将其传递到moment.utc来声明它是UTC,然后当您将其转换为本地时,它将在8:00结束。

然而,虽然这就是你要求的,但我的猜测是date实际上是一个JavaScript Date对象,其字符串输出.toString()就是你在这里展示的。在这种情况下,Date对象已经表示特定时间点,即UTC时间6:00。因此,无论您是moment.utc(date).local()还是仅moment(date),都无关紧要。两者都将在同一时刻留给您,以当地时区为代表。

当您认为它实际上是UTC值时,您可能想要回到您的输入并弄清楚如何包含GMT+0100。请注意,如果您实际上有8:00 UTC,那么您的输入会显示09:00 GMT+0100

答案 1 :(得分:0)

您可能希望将Moment TimeZone与MomentJS(http://momentjs.com/timezone/

一起使用
date = moment.tz("Thu Oct 27 2016 07:00:00", "GMT Standard Time");
date.clone().local().format('ddd MMM DD YYYY HH:mm:ss');

修改

删除utc部分会在没有Moment TimeZone的情况下为我修复它:

date = 'Thu Oct 27 2016 07:00:00 GMT+0100 (GMT Standard Time)';
moment(date).local().format('ddd MMM DD YYYY HH:mm:ss');