moment.js – UTC给出错误的date

为什么moment.js UTC总是显示错误的date。 例如从chrome的开发者控制台:

moment(('07-18-2013')).utc().format("YYYY-MM-DD").toString() // or moment.utc(new Date('07-18-2013')).format("YYYY-MM-DD").toString() 

他们两个都会回来“2013-07-17”为什么回到十七日而不是十八日,已经通过了。

但是,如果我使用没有utc的momentjs:

 moment(new Date('07-18-2013')).format("YYYY-MM-DD").toString() 

我回到“2013-07-18” ,这也是我使用moment.js UTC时期望的。

这是否意味着在使用moment.js UTC时我们无法得到正确的date?

默认情况下,MomentJS在本地时间parsing。 如果只提供datestring(没有时间),则时间默认为午夜。

在你的代码中,你创build一个本地date,然后将其转换为UTC时区(实际上,它使时刻切换到UTC模式 ),所以当它被格式化时,它会被转移(取决于你当地的时间)向后。

如果本地时区是UTC + N(N是一个正数),并且parsing一个只包含date的string,则会得到以前的date。

这里有一些例子来说明它(我的本地时间偏移是UTC + 3在DST期间):

 >>> moment('07-18-2013', 'MM-DD-YYYY').utc().format("YYYY-MM-DD HH:mm") "2013-07-17 21:00" >>> moment('07-18-2013 12:00', 'MM-DD-YYYY HH:mm').utc().format("YYYY-MM-DD HH:mm") "2013-07-18 09:00" >>> Date() "Thu Jul 25 2013 14:28:45 GMT+0300 (Jerusalem Daylight Time)" 

如果您希望将date时间string解释为UTC,则应该明确表示它:

 >>> moment(new Date('07-18-2013 UTC')).utc().format("YYYY-MM-DD HH:mm") "2013-07-18 00:00" 

或者,正如马特·约翰逊(Matt Johnson)在他的回答中提到的那样,你可以( 也可能应该 )使用moment.utc()将它parsing为UTCdate,并将格式string作为第二个参数来防止歧义。

 >>> moment.utc('07-18-2013', 'MM-DD-YYYY').format("YYYY-MM-DD HH:mm") "2013-07-18 00:00" 

为了转换UTC时间并将其转换为本地date,可以使用local()方法,如下所示:

 >>> moment.utc('07-18-2013', 'MM-DD-YYYY').local().format("YYYY-MM-DD HH:mm") "2013-07-18 03:00" 

Datemoment都会默认parsing浏览器本地时区的inputstring。 但Date有时与这方面不一致。 如果string具体是YYYY-MM-DD ,使用连字符 ,或者如果是YYYY-MM-DD HH:mm:ss ,则会将其解释为本地时间 。 与Date不同的是,关于它如何parsing的moment总是一致的。

以您提供的格式parsinginput时刻为UTC的正确方法如下所示:

 moment.utc('07-18-2013', 'MM-DD-YYYY') 

请参阅此文档 。

如果你想以不同的格式输出,你可以这样做:

 moment.utc('07-18-2013', 'MM-DD-YYYY').format('YYYY-MM-DD') 

你不需要显式地调用toString

请注意,提供input格式非常重要。 没有它,像01-04-2013这样的date可能会被处理为1月4日或4月1日,这取决于浏览器的文化设置。