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

时间:2017-10-04 12:20:03

标签: javascript timezone momentjs timezone-offset

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

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

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

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

1 个答案:

答案 0 :(得分:2)

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

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

    2017年10月24日星期二00:00:00 GMT + 0000

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

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

但两个日期对应的是同一时刻(UTC的午夜与+05:30偏移中的5:30 AM相同),因此millis值将相同(均为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,所以不是将日期/时间转换为偏移量,而是保持相同的值 - 在这种情况下,它将在+05:30偏移量中为午夜:< / p>

      

    2017年10月24日星期二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)。

第一行只是以UTC格式获取此值,因此结果为24/10/2017 00:00 +00:00

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

第三行(utcOffset(5.5, true))不会将午夜的UTC 转换为在印度的上午5:30 。相反,它会创建相当于印度午夜的日期,这就是结果为24/10/2017 00:00 +05:30的原因。 valueOf()返回1508783400000,相当于印度午夜 23/10/2017 18:30 UTC (6:前一天下午30点,这就是为什么价值低于原价值的原因。)