moment.utc(string)将缺少时区的ISO8601解析为本地时间
这就是ISO8601所说的...和EcmaScript 6
我认为这适用于moment(string)
很好,但是当使用moment.utc(string)
,我认为这意味着您希望将其解析为UTC。
moment('2010-10-20T08:40'); // should parse to local time
moment.utc('2010-10-20T08:40'); // should parse to utc time
我有一个问题,我想与此有关:
我正在尝试将此日期转换为2012年12月4日(UTC的DD-MM-YYYY)为其Unix时间戳。
我正在这样做:
var date = '12-04-2012';
var mm = moment().utc( date, "DD-MM-YYYY" );
console.log( mm.valueOf() );
这将输出错误的时间戳: 1334670827391
。
如果我尝试:
console.log( mm.format('DD-MM-YYYY') );
胜负: 17-04-2012
a538306解决了这个问题。 将在1.6.0中发布
我仍然在最新版本中看到此问题。
我正在传递:moment.utc('2012-12-14T00:29:40.276Z')并得到:{_d:2012年12月13日星期四18:29:40 GMT-0600(中部标准时间),_ isUTC:是(2012年12月13日,星期四,GMT-0600(中部标准时间))。。这不是使用utc时间,而是我的本地时区。
这就是我从1.7.2
。
moment.utc('2012-12-14T00:29:40.276Z').format(); // "2012-12-14T00:29:40+00:00"
这是我用chrome写入控制台时发生的情况(最新版本):
console.log(moment.utc('2012-12-14T00:29:40.276Z'));
console.log(moment.utc('2012-12-14T00:29:40.276Z')。format());
console.log(moment.utc('2012-12-14T00:29:40.276Z')。toDate());
H {_d:2012年12月13日星期四18:29:40 GMT-0600(中部标准时间),_ isUTC:是,true,_a:Array [8],_ lang:false,克隆:function…}
2012-12-14T00:29:40 + 00:00
2012年12月13日,星期四,格林尼治标准时间0600(中部标准时间)
它不是应该在utc中创建新日期(无时区)吗? 同样,第一个console.log显示具有cst时区的moment对象,而不是世界标准时间。
Thu Dec 13 2012 18:29:40 GMT-0600
实际上与2012-12-14T00:29:40.276Z
完全相同。 它们只是显示同一时间的不同方式。 如果需要,可以通过以下操作查看。
console.log(moment.utc('2012-12-14T00:29:40.276Z').toDate().toString());
// Thu Dec 13 2012 16:29:40 GMT-0800 (PST)
console.log(moment.utc('2012-12-14T00:29:40.276Z').toDate().toUTCString());
// Fri, 14 Dec 2012 00:29:40 GMT
本地JS Date
没有utc vs本地模式,只具有getUTCHours
和getHours
。
Moment.js以utc模式和本地模式的思想抽象了这些getUTC*
与get*
方法。 如果此刻处于utc模式,则使用getUTC*
方法。 如果处于本地模式,则使用get*
方法。
谢谢您的澄清。
我期待并想到将iso标准声明为Z表示没有时区,默认为utc。 因此,如果您做了moment.utc('2012-12-14T00:29:40.276Z')或moment('2012-12-14T00:29:40.276Z'),则两者都将被视为utc,而utc标志将是设置为true。
PS,非常抱歉打扰您:。 我正在为另一个问题创建新的讨论:
没问题。
我们未同时moment()
和moment.utc()
设置isUTC
标志的原因是,即使您正在解析UTC + 0字符串,您可能仍要显示用户时区中的时刻。
这是一个非常常见的用例,因为这是将时间存储为ISO8601 UTC + 0字符串的时间并将其显示在用户时区的前端的一种好习惯。
谢谢,我希望其他人也能对此讨论有所帮助。
当我运行console.log(moment.utc())时,它报告“ Fri Jan 18 2013 16:25:32 GMT-0800(UTC)”但是,这是本地太平洋时间,而不是当前UTC时间。 由于我在登录时明确表示(UTC),因此我认为它认为“ 16:25:32”是UTC时间,但实际上是本地太平洋时间...
另外,我假设moment.utc()。valueOf()返回自纪元以来的UTC毫秒数,这似乎是不正确的。 您有没有看到这种行为?
console.log(moment())
H {_d:2013年1月18日星期五格林尼治标准时间0800(UTC),_ isUTC:否,_a:空,_lang:否}
console.log(moment.utc())
H {_d:2013年1月18日星期五格林尼治标准时间0800(UTC),_ isUTC:是,_a:空,_lang:否}
看起来它正在做的只是翻转_isUTC标志。 :P无论我是否指定.utc(),它似乎都在返回本地时间。
是的, .utc
和.local
只需翻转.isUTC
标志,该标志将在所有getter和setter中使用。
由于本地Date.toString
是在本地时间显示的,因此您在两个实例中看到的是相同的表示形式。
但是, .format
使用.isUTC
标志,因此在将isUTC
标志设置为true的情况下格式化时刻将按预期的格式进行格式化。
请参阅以下有关Date.prototype.toString
, Date.prototype.toUTCString
和moment.fn.format
的区别。
moment().toDate().toString(); // "Wed Jan 23 2013 09:48:54 GMT-0800 (PST)"
moment.utc().toDate().toString(); // "Wed Jan 23 2013 09:48:54 GMT-0800 (PST)"
moment().toDate().toUTCString(); // "Wed, 23 Jan 2013 17:48:54 GMT"
moment.utc().toDate().toUTCString(); // "Wed, 23 Jan 2013 17:48:54 GMT"
moment().format(); // "2013-01-23T09:48:54-08:00"
moment.utc().format(); // "2013-01-23T17:48:54+00:00"
同样的问题在这里:
moment()。valueOf()和moment()。utc()。valueOf()
返回相同的值! :失望:
因此,要获得utc毫秒,我需要:
moment().valueOf() - (moment().utcOffset() * 60 * 1000)
@rubenspgcavalcante-我不确定您在问什么。 这两个是_supposed_,以返回相同的值,两者都距离unix纪元以来的毫秒数。
您编写的代码段实际上会返回不同的时间。
我遇到类似的问题,其中UTC标志设置为true,但是当我校准format()时; 它返回本地时间。 这是屏幕截图。
我调用format();之后,对象之后的行是var的console.log。 在上面。
难道我做错了什么?
@ james-hoegerl,它看起来像内部日期对象是2016年7月5日中部19:00。 再加上五个小时即可到达UTC,现在是7月6日,这似乎正在记录在日志中,因此总而言之,我没有发现任何错误。
看起来您正在使用全日历。 它会做一些扩展/猴子补丁操作,这可能会导致异常行为。
好吧,也许我只是对uct感到困惑。 我以为我会得到“ 2016-05-07 07:00:00”,那么我可以将其存储在数据库中,然后通过瞬间获取每个最终用户计算机的本地时间。
因此,首先,我假设您的意思是6016-07-05(7月5日,而不是5月7日)。 您当地的时间是7月5日19:00。 根据美国中部夏令时进行了调整,我们增加了五个小时。 该时间为7月6日午夜。
如果您打算7月5日到达,那么我认为您真正想要的是当地时间,而不是UTC。 您可以立即调用.local()以使其返回本地时间。
您可能会发现这很有帮助: https :
非常感谢您的@maggiepint帮助。 是的,我之前的评论我的意思是7-5。 抱歉,这个周末我在游泳池旁的手机上匆匆写了那条评论。 我看到了现在我的想法已经倒退了。 fullcalendar适用于所有不明确的时区矩对象,所以我认为我只是对此有一些误解,需要对此进行一些研究。 再次感谢您的宝贵时间
嗨,要将UTC转换为用户时间,我们是否需要提供格式。
例如:let utcTime = moment({小时:10,分钟:20).format('YYYY-MM-DD HH:mm:ss');
让stillUtc = moment.utc(utcTime).toDate();
让localTime = moment(stillUtc).local();
现在我可以获取localTIme。 但是,如果我删除格式,我仍然可以使用UTC格式。 这里10:20是UTC timeZone,它来自后端。 我想向用户显示时区。
请帮我。
同样的问题在这里:
moment()。valueOf()和moment()。utc()。valueOf()
返回相同的值! 😞
因此,要获得utc毫秒,我需要:
moment()。valueOf()-(moment()。utcOffset()* 60 * 1000)
@rubenspgcavalcante-我不确定您在问什么。 这两个应该返回相同的值,两者均以unix纪元为单位(以毫秒为单位)。
@ mj1856我不明白moment()。valueOf()和moment()。utc()。valueOf()应该如何返回相同的值?
我必须增加对UTC功能的困惑。 对moment.utc()的最直观的期望是它将返回一个以UTC时间表示当前日期/时间的Moment对象。 但是根据讨论,情况并非如此,它只是设置标志。 仍不清楚该标志的作用。 文档中未提及这些内容,这使其严重不足。 请在您的待办事项列表中添加有关示例的示例说明。 谢谢。
最有用的评论
我必须增加对UTC功能的困惑。 对moment.utc()的最直观的期望是它将返回一个以UTC时间表示当前日期/时间的Moment对象。 但是根据讨论,情况并非如此,它只是设置标志。 仍不清楚该标志的作用。 文档中未提及这些内容,这使其严重不足。 请在您的待办事项列表中添加有关示例的示例说明。 谢谢。