gpt4 book ai didi

javascript - Moment JS 初始化和 utc() 方法

转载 作者:行者123 更新时间:2023-11-30 16:16:36 25 4
gpt4 key购买 nike

我想了解 Moment JS 对其 moment 对象的初始化。

例如,如果我想为日期和时间创建一个时刻:2000 年 4 月 1 日凌晨 3:25:00,UTC 与 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
}

然后我创建了一个方便的函数,我可以用它来用 moment js 创建一个 moment:

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;
}

当我使用这个功能来创造时刻...例如

  var result =  moment(obj);

如果我检查上面的结果对象,我可以看到它有一个属性 _d我希望有一个值,例如:

_d  Date {Sat Apr 01 2000 03:25:00 GMT+0800 (HKT)}

但实际值对我来说没有意义,因为我指定时间是 3:25:00 并且已经是 GMT +0800,所以不需要再增加 8 小时....

_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 是为了说明我的观点...

http://jsfiddle.net/nx2ch4ot/2/

最佳答案

一些事情:

  • 在 JavaScript 中,以下划线作为前缀的对象字段应被视为私有(private)/内部字段,而不是直接使用,这是 JavaScript 中的一个常见约定。虽然通过闭包隐藏它们可能对用户更友好,但速度也较慢,因此像 moment.js 这样的库选择让它们暴露。

  • 不使用 _d,而是调用公共(public)函数,例如 .format(),或文档中显示的任何其他函数。

  • 如果您真的想了解更多关于 _d 的信息,请查看 this answer .

  • Date 对象中显示的时区始终与运行代码的计算机相关。 JavaScript 的 Date 对象无法反射(reflect)其他时区。当 moment 使用 _d 时,它主要仅将其用于 _d.getTime() 给出的瞬时值,它仅反射(reflect) 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 非常相似.您可以将对象传递给 momentmoment.utc。与您的不同之处在于 moment 使用从零开始的月份,并且尚不支持传递 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;
    }

关于javascript - Moment JS 初始化和 utc() 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35427486/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com