【问题标题】:Convert date to UTC using moment.js使用 moment.js 将日期转换为 UTC
【发布时间】:2014-06-11 13:42:33
【问题描述】:

可能很容易回答这个问题,但我似乎无法找到让 moment.js 以毫秒为单位返回 UTC 日期时间的方法。这是我正在做的事情:

var date = $("#txt-date").val(),
    expires = moment.utc(date);

知道我做错了什么吗?

【问题讨论】:

    标签: javascript momentjs


    【解决方案1】:

    这是in the documentation。对于像图书馆这样的时刻,我敦促您阅读整个文档。这真的很重要。

    假设输入文本是根据用户的当地时间输入的:

     var expires = moment(date).valueOf();
    

    如果指示用户实际输入 UTC 日期/时间,则:

     var expires = moment.utc(date).valueOf();
    

    【讨论】:

    • 已编辑 - “轻松”删除。 :)
    • 如果我已经有一个带有时区的时刻日期时间,我该如何将其转换为 UTC?
    • @Alexander - .utc()
    • 那行不通。这只会改变日期使用的方法,而不是日期本身。
    • @Colleen - 是的,但通常会调用其中一种方法,例如.format(),它会发出 UTC 值。它不能更改内部日期值本身,因为 Date 已经在跟踪 UTC 时间戳。它总是只是调用它的方法来确定是发出 UTC 还是本地时间。在这方面,时刻是相同的。
    【解决方案2】:

    我使用这种方法并且它有效。 ValueOf 对我不起作用。

    moment.utc(yourDate).format()
    

    【讨论】:

    • 这根据文档工作。将本地时间转换为 UTC。
    • 这里有些可疑。我正在使用 moment.js 版本。 2.17.1 如果 'yourdate' 是 '2017-10-14T21:00:00Z' (en-us) 那么上面的 sn-p 返回完全相同的结果 '2017-10-14T21:00:00Z' 这显然它不是UTC,因为我在gmt + 3。正确的结果是 '2017-10-15T00:00:00+03:00',你可以通过 'moment(yourDate).format()' 得到这个结果。
    【解决方案3】:

    如果所有其他方法都失败了,只需使用本地偏移量的倒数重新初始化即可。

    var timestamp = new Date();
    var inverseOffset = moment(timestamp).utcOffset() * -1;
    timestamp = moment().utcOffset( inverseOffset  );
    
    timestamp.toISOString(); // This should give you the accurate UTC equivalent.
    

    【讨论】:

    • 这不起作用。起作用的是将keepOffset 参数设置为true,如moment(timestamp).toISOString(true),
    【解决方案4】:
    moment.utc(date).format(...); 
    

    是要走的路,因为

    moment().utc(date).format(...);
    

    确实表现得很奇怪...

    【讨论】:

    • 能否详细说明moment().utc(date).format(...)的怪异行为?
    • 行为并不奇怪,那些是​​不同的方法。第一个moment.utc(date) 用于parsing 和date。第二个moment().utc(date) 用于manipulating 当前时间(moment()),date 参数没有用,因为在这种情况下,.utc() 不需要任何参数。
    【解决方案5】:

    您不需要进行比较然后检索毫秒数吗?

    例如:

    let enteredDate = $("#txt-date").val(); // get the date entered in the input
    let expires = moment.utc(enteredDate); // convert it into UTC
    

    这样你就有了 UTC 的到期日期。 现在您可以获取 UTC 中的“现在”日期并进行比较:

    var rightNowUTC = moment.utc(); // get this moment in UTC based on browser
    let duration = moment.duration(rightNowUTC.diff(expires)); // get the diff
    let remainingTimeInMls = duration.asMilliseconds();
    

    【讨论】:

    • moment.valueOf() 和 (new Date()).getTime() 都返回自 1970 年 1 月 1 日 UTC 以来的毫秒数(这是一个标准)
    【解决方案6】:

    在这里,我正在传递日期对象并将其转换为 UTC 时间。

    $.fn.convertTimeToUTC = function (convertTime) {
       if($(this).isObject(convertTime)) {
            return moment.tz(convertTime.format("Y-MM-DD HH:mm:ss"), moment.tz.guess()).utc().format("Y-MM-DD HH:mm:ss");
        }
    };
    // Returns if a value is an object
    $.fn.isObject =  function(value) {
        return value && typeof value === 'object';
    };
    
    
    //you can call it as below
    $(this).convertTimeToUTC(date);
    

    【讨论】:

      【解决方案7】:

      截至:moment.js version 2.24.0

      假设您有一个本地日期输入,这是将您的 dateTime 或 Time 输入转换为 UTC 的正确方法 :

      var utcStart = new moment("09:00", "HH:mm").utc();
      

      或者如果你指定一个日期

      var utcStart = new moment("2019-06-24T09:00", "YYYY-MM-DDTHH:mm").utc();
      

      如您所见,结果输出将以 UTC 格式返回:

      //You can call the format() that will return your UTC date in a string 
       utcStart.format(); 
      //Result : 2019-06-24T13:00:00 
      

      但如果您按以下方式执行此操作,它不会转换为 UTC:

      var myTime = new moment.utc("09:00", "HH:mm"); 
      

      您只是将输入设置为 UTC 时间,就好像您提到 myTime 是 UTC 时间一样,......输出将是 9:00

      【讨论】:

      • 如果输入是UTC,var s = new moment("2019-06-24T09:00", "YYYY-MM-DDTHH:mm").utc();是正确的阅读方式。进一步调用 s.format() 会将其转换为本地时间。
      【解决方案8】:

      阅读 moment.js here 的文档。 请参阅下面的示例和输出,其中我将 GMT 时间转换为本地时间(我的区域是 IST),然后我将本地时间转换为 GMT。

      // convert GMT to local time
      console.log('Server time:' + data[i].locationServerTime)
      let serv_utc = moment.utc(data[i].locationServerTime, "YYYY-MM-DD HH:mm:ss").toDate();
      console.log('serv_utc:' + serv_utc)
      data[i].locationServerTime = moment(serv_utc,"YYYY-MM-DD HH:mm:ss").tz(self.zone_name).format("YYYY-MM-DD HH:mm:ss");
      console.log('Converted to local time:' + data[i].locationServerTime)
      
      // convert local time to GMT
      console.log('local time:' + data[i].locationServerTime)
      let serv_utc = moment(data[i].locationServerTime, "YYYY-MM-DD HH:mm:ss").toDate();
      console.log('serv_utc:' + serv_utc)
      data[i].locationServerTime = moment.utc(serv_utc,"YYYY-MM-DD HH:mm:ss").format("YYYY-MM-DD HH:mm:ss");
      console.log('Converted to server time:' + data[i].locationServerTime)
      

      输出是

      Server time:2019-12-19 09:28:13
      serv_utc:Thu Dec 19 2019 14:58:13 GMT+0530 (India Standard Time)
      Converted to local time:2019-12-19 14:58:13
      local time:2019-12-19 14:58:13
      serv_utc:Thu Dec 19 2019 14:58:13 GMT+0530 (India Standard Time)
      Converted to server time:2019-12-19 09:28:13
      

      【讨论】:

        【解决方案9】:

        这就是答案:

        moment.utc(moment(localdate)).format()
        
        localdate = '2020-01-01 12:00:00'
        
        moment(localdate)
        //Moment<2020-01-01T12:00:00+08:00>
        
        moment.utc(moment(localdate)).format()
        //2020-01-01T04:00:00Z
        

        【讨论】:

          【解决方案10】:

          这对我有用。其他人可能会觉得它很有用。

          let date = '2020-08-31T00:00:00Z'
          moment.utc(moment(date).utc()).format() // returns 2020-08-30T22:00:00Z
          

          【讨论】:

            【解决方案11】:

            这个moment.utc(stringDate, format).toDate() 为我工作。

            这moment.utc(date).toDate()不是。

            【讨论】:

              【解决方案12】:

              这对我有用:

              const localtime = 1622516400000
              moment(localtime).utc(true).format()
              

              【讨论】:

              • 我想这不是作者要问的,这会取出时区信息,实际修改localtime............
              猜你喜欢
              • 1970-01-01
              • 2021-03-26
              • 2018-07-08
              • 2013-10-24
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2014-07-23
              • 2021-04-19
              相关资源
              最近更新 更多