moment.js - UTC does not work as i expect it

12,808

Solution 1

Call moment.utc() the same way you're calling Date.UTC:

var withMoment = moment.utc([now.getFullYear(), now.getMonth(), now.getDate(), now.getHours(), now.getMinutes(), now.getSeconds()]).valueOf();

I think calling moment.utc(now) will make it assume now lives in the local timezone, and it will convert it to UTC first, hence the difference.

Solution 2

What you are doing is essentially this.

var now    = new Date(2013, 02, 28, 11, 11, 11);
var native = Date.UTC(2013, 02, 28, 11, 11, 11);

console.log(now === utc); // false
console.log(now - utc); // your offset from GMT in milliseconds

Because now is constructed in the current timezone and native is constructed in UTC, they will differ by your offset. 11 AM PST != 11 AM GMT.

Share:
12,808
hereandnow78
Author by

hereandnow78

Updated on June 25, 2022

Comments

  • hereandnow78
    hereandnow78 almost 2 years

    testing in the node console:

    var moment = require('moment');
    
    // create a new Date-Object
    var now = new Date(2013, 02, 28, 11, 11, 11);
    
    // create the native timestamp
    var native = Date.UTC(now.getFullYear(), now.getMonth(), now.getDate(), now.getHours(), now.getMinutes(), now.getSeconds());
    
    // create the timestamp with moment
    var withMoment = moment.utc(now).valueOf()
    // it doesnt matter if i use moment(now).utc().valueOf() or moment().utc(now).valueOf()
    
    // native: 1364469071000
    // withMoment: 1364465471000
    native === withMoment // false!?!?! 
    
    // this returns true!!!
    withMoment === now.getTime()
    

    why isnt native the same timestamp as withMoment? why does withMoment return the timestamp calculated from the current local-time? how can i achieve that moment.utc() returns the same as Date.UTC()?