从现在moment.js是报告在Firefox / IE之后,Chrome不同的结果

问题描述 投票:3回答:3

我们愚蠢地假设的momentjs代码块将在所有的浏览器。现在,它的正确使用Chrome,但所有其他浏览器它不是应用UTC偏移。如何使这个code工作始终在其他浏览器?现在,Chrome是工作,所有的人都没有。

 new moment(new Date(date)).fromNow();
 //below shows an example of an exact date. 
 var now = new moment(new Date("2013-09-30T23:33:36.937")).fromNow();

在Chrome中,你会看到类似“现在”,你会看到“4小时”的所有其他浏览器

momentjs
3个回答
7
投票

该办法得到它的工作:

var now = moment.utc("2013-10-01T13:15:30.937").fromNow();

请注意,如果你把它变成一个“日期”,并呼吁moment.utc

var now = moment.utc(new Date("2013-10-01T13:15:30.937")).fromNow();

不起作用。现在,我想这是有道理的。


5
投票

原来的答案

尝试这个:

var now = moment(date).fromNow();

但鲁特是正确的,你应该指定一个Z或类似-07:00偏移。从.net,你应该确保你使用一个DateTime.Kind设置为UTC,或使用DateTimeOffset场。

扩展答案

你应该明白,当你发送2013-10-01T13:15:30.937一串,你不发送任何与它的上下文。有没有办法单独从该字符串知道时间是否是在UTC,或在您的服务器的时区,或在浏览器的时区。

如果你直接将它传递给moment("2013-10-01T13:15:30.937"),它要承担浏览器的本地时区的情况下。

当你发现,你可以明确地告诉时刻,这一次是在UTC通过.utc功能,如moment.utc("2013-10-01T13:15:30.937")

虽然这会工作,有充分的理由不依靠单独。例如,如果你曾经使用同一服务器API的另一个应用程序,或者也许是第三方消费?除非你分别告诉他们,时间戳是代表UTC,那么有没有办法知道。

这些字符串是在ISO 8601 / RFC 3339格式。该规范的第一部分介绍了如何指示时间戳是UTC。您只需在最后加一个Z。如果您提供的Z那么这个时间戳的任何消费者都知道,时间应被解释为UTC。果然,如果你传递到时刻直接,如moment("2013-10-01T13:15:30.937Z"),它会给你期望的结果。

你在你生成从ASP.Net的Web API这些值评论说。调试模式运行你的应用程序,并设置一个断点,所以你可以检查你的控制器的输出。当你看到问题的具体DateTime属性,你会看到,它有自己的.Kind财产。这可能是设置为DateTimeKind.Unspecified

由于可以明确地说你的应用程序使用UTC,然后将这些价值观应该有DateTimeKind.Utc代替。一旦被设置,那么的WebAPI将正确的时戳的端部发射Z

某处在你的服务器端代码,你应该做这样的事情:

dt = DateTime.SpecifyKind(dt, DateTimeKind.Utc);

你应该尽可能早地做到这一点。例如,在数据访问层,当你从数据库中检索的值。如果这是不可能的,那么至少你应该做在你的API控制器,因此该值被正确地发出。

另见DateTimeKindDateTime.SpecifyKind的MSDN参考。

此外 - 你让浏览器不一致的原因是因为您正在使用Date对象的构造函数,而不是建在moment解析功能。虽然瞬间将接受Date,有几个已知问题和矛盾着如何浏览器都支持从字符串解析Date。其中一些不一致的都记录here


0
投票

用这个:

 var lastLoginTime = moment(user.lastLoginTime).fromNow();
© www.soinside.com 2019 - 2024. All rights reserved.