我想了解Moment JS对其时刻对象的初始化。
例如,如果我想为日期和时间创建一个时刻: 2000年4月1日凌晨3:25:00,与UTC / GMT相差+8小时。
我在javascript对象中表示这个:
var obj = {
year: 2000,
month: 4, //APRIL
day: 1,
hour: 3,
minute: 25,
second: 0,
utcOffset: 8 //8 hours from UTC
}
然后我创建了一个方便的函数,我可以用它创建一个片刻js:
var makemoment = function(obj){
var m = moment([obj.year, obj.month - 1, obj.day, obj.hour, obj.minute, obj.second, 0]).utcOffset(obj.utcOffset);
return m;
}
当我用这个功能来创造时刻...... e.g。
var result = moment(obj);
如果我检查上面的结果对象,我可以看到它有一个属性_d
我希望有一个值,如:
_d Date {Sat Apr 01 2000 03:25:00 GMT+0800 (HKT)}
但实际值对我来说没有意义,因为我指定的时间是3:25:00,而且已经是GMT +0800,所以不需要增加8小时的时间...... / p>
_d Date {Sat Apr 01 2000 11:25:00 GMT+0800 (HKT)}
尽管有这个_d值,但如果我console.log(result)
我得到了正确的预期日期:
2000-04-01T03:25:00+08:00
如果我暂时调用utc方法。例如result.utc()
如果我再次检查对象,我可以看到现在_d
已更改为我原来预期的值:
_d Date {Sat Apr 01 2000 03:25:00 GMT+0800 (HKT)}
然而,现在如果我做result.format()
我得到了正确的UTC日期和时间:
2000-03-31T19:25:00+00:00
我不明白这里的东西???? 如何在Moment.js中使用_d值??? 我应该忽略_d值,因为它只是Moment.js ???
内部的东西我已经创建了JSFiddle来说明我的观点...
答案 0 :(得分:2)
一些事情:
JavaScript中的常见惯例是,以下划线为前缀的对象字段应视为私有/内部而不是直接使用。虽然通过闭包隐藏它们可能更加用户友好,但它也更慢,因此像moment.js这样的库选择让它们暴露出来。
不要使用_d
,而是调用公共函数,例如.format()
或文档中显示的任何其他函数。
如果确实希望了解_d
的更多信息,请查看this answer。
Date
对象中显示的时区始终相对于运行代码的计算机。 JavaScript的Date
对象无法反映其他时区。当时刻使用_d
时,它主要使用它仅由_d.getTime()
给出的瞬时值,它仅反映UTC。 (我们实际上正在考虑在将来的版本中完全删除_d
。)
您确实需要调整偏移量,但您应该从moment.utc
而不是当地时间开始。更正的功能是:
var makemoment = function(obj){
var m = moment.utc([obj.year, obj.month - 1, obj.day, obj.hour, obj.minute, obj.second, 0]);
m.subtract(obj.utcOffset, 'hours');
m.utcOffset(obj.utcOffset);
return m;
}
您编写的函数与already built in to moment非常相似。您可以将对象传递给moment
或moment.utc
。与你的不同之处在于,时刻会使用从零开始的月份,并且还不支持传递utcOffset
字段。您可以考虑使用它。
var makemoment = function(obj){
obj.month--; // switch to zero-based months
var m = moment.utc(obj);
obj.month++; // put it back
m.subtract(obj.utcOffset, 'hours');
m.utcOffset(obj.utcOffset);
return m;
}