我有以下日期的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
答案 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');