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"
Date
和moment
都会默认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日,这取决于浏览器的文化设置。