使用utcoffset后如何在momentjs中获取纪元时间

How to get epoch time in momentjs after using utcoffset

const epoch = Date.UTC(2017,09,24)

const moment_epoch = moment.utc(epoch).utcOffset(5.5).valueOf()

为什么在添加偏移量时 epochmoment_epoch 产生相同的输出?

添加偏移量后如何获取纪元时间?

如果您一步一步地检查这些值,就会更容易理解发生了什么:

  • Date.UTC(2017,09,24) 产生相当于 2017 年 10 月 24 日th 午夜的 UTC (1508803200000) 时间戳。
  • moment.utc(epoch) 生成 UTC 日期,相当于上面的毫秒值:

    Tue Oct 24 2017 00:00:00 GMT+0000

  • moment.utc(epoch).utcOffset(5.5) 只是将 UTC 日期转换为 +05:30 偏移量:

    Tue Oct 24 2017 05:30:00 GMT+0530

但是两个日期对应于同一时刻(UTC 午夜与 5:30 AM 在 +05:30 偏移量中相同),因此毫秒值将相同(两者都是 1508803200000).


不确定你到底想做什么,但无论如何:

  • 如果你想添加 5 小时 30 分钟到日期,只需执行:

    moment.utc(epoch).add(5, 'h').add(30, 'm')
    

    请注意,这不会更改偏移量。它只是得到一个比原始日期晚 5 小时 30 分钟的日期。

  • 如果你想要一个对应午夜 +05:30 偏移量的日期,你可以这样做:

    moment.utc(epoch).utcOffset(5.5, true)
    

    第二个参数 tells momentjs to preserve the same local date/time,因此它不会将 date/time 转换为偏移量,而是保持相同的值 - 在这种情况下,+05:30 偏移量将是午夜:

    Tue Oct 24 2017 00:00:00 GMT+0530


关于 your jsfiddle link,我只是稍作更改以打印偏移量:

moment.utc(1508803200000).format("DD/MM/YYYY HH:mm Z") // 24/10/2017 00:00 +00:00
moment.utc(1508803200000).utcOffset(5.5).format("DD/MM/YYYY HH:mm Z") // 24/10/2017 05:30 +05:30
moment.utc(1508803200000).utcOffset(5.5, true).format("DD/MM/YYYY HH:mm Z") // 24/10/2017 00:00 +05:30
moment.utc(1508803200000).valueOf() // 1508803200000
moment.utc(1508803200000).utcOffset(5.5).valueOf() // 1508803200000
moment.utc(1508803200000).utcOffset(5.5, true).valueOf() // 1508783400000

1508803200000 对应于 2017-10-24T00:00:00Z(UTC 午夜)和 2017-10-24T05:30+05:30(印度 5:30 AM)。

第一行只是获取UTC的这个值,所以结果是24/10/2017 00:00 +00:00.

第二行将这个相同的值转换为 +05:30 偏移量中相应的本地 date/time。这不会改变纪元值(它仍然对应于 1508803200000)。结果相当于印度的 date/time,也就是 24/10/2017 05:30 +05:30(5:30 AM 的偏移量 +05:30,相当于 UTC 的午夜 - 两者代表相同的时刻,这就是为什么valueOf() 是一样的)。

第三行(utcOffset(5.5, true))没有将 UTC 的 midnight 转换为印度的 5:30AM[=86] =].相反,它创建了一个相当于印度午夜 的日期,这就是结果为24/10/2017 00:00 +05:30 的原因。而 valueOf() returns 1508783400000,相当于 印度的午夜 23/10/2017 18:30 in UTC(前一天下午6点30分,所以这个值比原来的值低)。