4

我有这个 ISO 日期:

var v = '2013-07-09T13:27:29.000Z';

如果我这样做:

var g = moment(v).format();

控制台给我 g 值作为正确的本地时间2013-07-08T17:25:08-03:00

但是,如果我这样做是为了获得时间:

console.log(moment(g).startOf('day').fromNow());

Moments 使用原始 v ISO 而不是格式化的 g 计算时间前。

为什么?

编辑:我已经测试了另一个时间插件(jquery.timeago),并且在传递原始 v 值时会发生同样的错误解析到本地时间。

我在这里做错了什么?此代码正在客户端执行,因此所有插件都应该为用户返回正确的本地时间。

编辑2:关于我正在尝试做的更多相关信息:

var v = notifs.ntime; //2013-07-09T13:27:29.000Z
var m = moment(v).zone(v).format(); // 2013-07-09T13:27:29+00:00 (wrong local)
var m2 = moment(v).format();  // 2013-07-09 10:27:29 (correct local)
var r = moment(v).zone(v).startOf('day').fromNow() // 21 hours ago (wrong)
var r2 = moment(v).startOf('day').fromNow() // 18 hours ago (wrong)
console.log(v);
console.log(m);
console.log(m2);
console.log(r);
console.log(r2);
console.log('-------------------');
/*
    2013-07-09T13:27:29.000Z                            
    2013-07-09T13:27:29+00:00                           
    2013-07-09T10:27:29-03:00                           
    21 hours ago                        
    18 hours ago                            
    -------------------

    I expected "8 hours ago" as now is 18:10 and (v) was set on 10:27 (m2)
*/
4

1 回答 1

3

我不太确定我是否遵循您要查找的内容。

通过使用您的g变量,您实际上是在执行以下操作:

moment(moment(v).format()).startOf('day').fromNow()

这有点多余。这与此完全相同:

moment(v).startOf('day').fromNow()

这将告诉你从现在到开始之间已经过去了多少时间这将告诉您从现在到当地一天v

如果您正在查找从现在到UTC日期开始之间经过了多少时间v,请改用它:

moment.utc(v).startOf('day').fromNow()

或者使用稍微不同的语法,但效果相同:

moment(v).utc().startOf('day').fromNow()

如果您正在寻找其他东西,请澄清。

演练

让我们来看看当我在我的计算机上运行你的原始代码时会发生什么。我在美国亚利桑那州,UTC-7 没有夏令时。

// we'll start with the string you provided
var v = '2013-07-09T13:27:29.000Z';

// and the redundant moment, but we'll take a look at the formatting
var g = moment(v).format();

console.log(g);                 // 2013-07-09T06:27:29-07:00
console.log(moment(g).format()) // 2013-07-09T06:27:29-07:00  (it didn't change)

// start of the local day is midnight in the local time zone
console.log(moment(g).startOf('day').format())  // 2013-07-09T00:00:00-07:00

// here's my time right now
console.log(moment().format())  // 2013-07-09T13:56:54-07:00

// and your final bit of code
console.log(moment(g).startOf('day').fromNow());  // 14 hours ago

正如您所看到的,它在确定一天的开始时使用当地时区正确执行。当然,当你在不同的时区运行它时,它会返回不同的结果。那是因为每个时区对每一天都有自己的概念。如果您想要一致的输出,那么您将删除startOf('day')调用。

推荐

在您上次更新说明您预计 8 小时后,您似乎根本不想要时间startOf('day')。只需这样做:

moment(v).fromNow()

没有必要参与.zone()其中。

于 2013-07-09T20:36:27.540 回答