首页 文章

MomentJS以UTC格式获取JavaScript日期

提问于
浏览
35

我无法通过以下方式获取MongoDB记录的JavaScript Date字符串 . 它继续使用我当地的时间 .

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

输出:

Tue Nov 11 2014 14:42:51 GMT-0500 (EST)

我需要它在UTC中,所以我可以在Mongo中保留这个时间戳,所以类型将是 Date .

我怎样才能做到这一点?

2 回答

  • 4

    时间戳是一个时间点 . 通常,这可以通过epoc之后的毫秒数表示(1970年1月1日12点UTC的Unix Epoc) . 该时间点的格式取决于时区 . 虽然它是相同的时间点,但"hours value"在时区之间并不相同,必须考虑到UTC的偏移量 .

    这里有一些代码来说明 . 一点是时间以三种不同的方式捕获 .

    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() );
    

    哪个输出:

    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
    

    就毫秒而言,每个都是相同的 . 它是完全相同的时间点(虽然在某些运行中,后一毫秒是一个更高) .

    就格式而言,每个都可以在特定时区中表示 . 对于完全相同的时间点,该时区字符串的格式看起来不同!

    你要比较这些时间 Value 吗?只需转换为毫秒 . 一个毫秒值始终小于,等于或大于另一毫秒值 .

    你想比较特定的'hour'或'day'值并担心他们"came from"不同的时区吗?首先使用 moment.utc( existingDate ) 转换为UTC,然后执行操作 . 从数据库出来时,这些转换的示例是示例中的最后一次 console.log 调用 .

  • 58

    调用toDate将创建一个基础JS Date对象的 copy (文档是关于它不是副本的右下角) . JS Date对象以UTC格式存储,并始终打印到东部时间 . 无论是否.utc()修改当前包装的底层对象都使用下面的代码 .

    你不需要时刻 .

    new Date().getTime()
    

    这是有效的,因为JS Date的核心是来自Unix Epoch的UTC . 这是非常令人困惑的,我相信界面中的一个很大的缺陷是混合本地和UTC这样的时间,没有方法中的描述 .

相关问题