<p>moment.utc(string)将缺少时区的ISO8601解析为本地时间</p>

创建于 2012-04-12  ·  24评论  ·  资料来源: moment/moment

看到这个评论: https :

最有用的评论

我必须增加对UTC功能的困惑。 对moment.utc()的最直观的期望是它将返回一个以UTC时间表示当前日期/时间的Moment对象。 但是根据讨论,情况并非如此,它只是设置标志。 仍不清楚该标志的作用。 文档中未提及这些内容,这使其严重不足。 请在您的待办事项列表中添加有关示例的示例说明。 谢谢。

所有24条评论

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本地模式,只具有getUTCHoursgetHours

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.toStringDate.prototype.toUTCStringmoment.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()时; 它返回本地时间。 这是屏幕截图。

screen shot 2016-07-10 at 8 50 15 am

我调用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对象。 但是根据讨论,情况并非如此,它只是设置标志。 仍不清楚该标志的作用。 文档中未提及这些内容,这使其严重不足。 请在您的待办事项列表中添加有关示例的示例说明。 谢谢。

此页面是否有帮助?
0 / 5 - 0 等级