MomentJS getting JavaScript Date in UTC

后端 未结 3 1521
春和景丽
春和景丽 2020-12-01 04:26

I am not able to get the JavaScript Date string for MongoDB record via the following. It keeps using my local time.

var utc = moment.utc().valueOf();
console         


        
相关标签:
3条回答
  • 2020-12-01 04:42

    Or simply:

    Date.now

    From MDN documentation:

    The Date.now() method returns the number of milliseconds elapsed since January 1, 1970

    Available since ECMAScript 5.1

    It's the same as was mentioned above (new Date().getTime()), but more shortcutted version.

    0 讨论(0)
  • 2020-12-01 04:55

    Calling toDate will create a copy (the documentation is down-right wrong about it not being a copy), of the underlying JS Date object. JS Date object is stored in UTC and will always print to eastern time. Without getting into whether .utc() modifies the underlying object that moment wraps use the code below.

    You don't need moment for this.

    new Date().getTime()
    

    This works, because JS Date at its core is in UTC from the Unix Epoch. It's extraordinarily confusing and I believe a big flaw in the interface to mix local and UTC times like this with no descriptions in the methods.

    0 讨论(0)
  • 2020-12-01 04:58

    A timestamp is a point in time. Typically this can be represented by a number of milliseconds past an epoc (the Unix Epoc of Jan 1 1970 12AM UTC). The format of that point in time depends on the time zone. While it is the same point in time, the "hours value" is not the same among time zones and one must take into account the offset from the UTC.

    Here's some code to illustrate. A point is time is captured in three different ways.

    var moment = require( 'moment' );
    
    var localDate = new Date();
    var localMoment = moment();
    var utcMoment = moment.utc();
    var utcDate = new Date( utcMoment.format() );
    
    //These are all the same
    console.log( 'localData unix = ' + localDate.valueOf() );
    console.log( 'localMoment unix = ' + localMoment.valueOf() );
    console.log( 'utcMoment unix = ' + utcMoment.valueOf() );
    
    //These formats are different
    console.log( 'localDate = ' + localDate );
    console.log( 'localMoment string = ' + localMoment.format() );
    console.log( 'utcMoment string = ' + utcMoment.format() );
    console.log( 'utcDate  = ' + utcDate );
    
    //One to show conversion
    console.log( 'localDate as UTC format = ' + moment.utc( localDate ).format() );
    console.log( 'localDate as UTC unix = ' + moment.utc( localDate ).valueOf() );
    

    Which outputs this:

    localData unix = 1415806206570
    localMoment unix = 1415806206570
    utcMoment unix = 1415806206570
    localDate = Wed Nov 12 2014 10:30:06 GMT-0500 (EST)
    localMoment string = 2014-11-12T10:30:06-05:00
    utcMoment string = 2014-11-12T15:30:06+00:00
    utcDate  = Wed Nov 12 2014 10:30:06 GMT-0500 (EST)
    localDate as UTC format = 2014-11-12T15:30:06+00:00
    localDate as UTC unix = 1415806206570
    

    In terms of milliseconds, each are the same. It is the exact same point in time (though in some runs, the later millisecond is one higher).

    As far as format, each can be represented in a particular timezone. And the formatting of that timezone'd string looks different, for the exact same point in time!

    Are you going to compare these time values? Just convert to milliseconds. One value of milliseconds is always less than, equal to or greater than another millisecond value.

    Do you want to compare specific 'hour' or 'day' values and worried they "came from" different timezones? Convert to UTC first using moment.utc( existingDate ), and then do operations. Examples of those conversions, when coming out of the DB, are the last console.log calls in the example.

    0 讨论(0)
提交回复
热议问题