【问题标题】:Convert milliseconds to an ISO 8601 duration将毫秒转换为 ISO 8601 持续时间
【发布时间】:2017-10-08 16:02:50
【问题描述】:

使用 Moment.js 将持续时间(以毫秒为单位)转换为 ISO 8601 持续时间的最简单方法是什么?

例如:

3600000 milliseconds > PT1H

【问题讨论】:

    标签: javascript momentjs duration iso8601


    【解决方案1】:

    由于在搜索如何使用 JavaScript 将毫秒转换为 ISO 8601 duration 时,这是目前最热门的结果之一,因此对于那些不能或不想使用 Moment.js 的人来说,这是一种使用 vanilla JS 的方法.

    const duration = (ms) => {
      const dt = new Date(ms);
      const units = [
        ['Y', dt.getUTCFullYear() - 1970],
        ['M', dt.getUTCMonth()],
        ['D', dt.getUTCDate() - 1],
        ['T', null],
        ['H', dt.getUTCHours()],
        ['M', dt.getUTCMinutes()],
        ['S', dt.getUTCSeconds()]
      ];
      
      let str = units.reduce((acc, [k, v]) => {
        if (v) {
          acc += v + k;
        } else if (k === 'T') {
          acc += k;
        } 
        return acc;
      }, '');
      
      str = str.endsWith('T') ? str.slice(0, -1) : str;
      return str ? `P${str}` : null;
    };
    
    console.log(duration(110723405000));
    // P3Y6M4DT12H30M5S
    console.log(duration(3600000));
    // PT1H

    【讨论】:

    • 这不处理小数秒。对于我的用例,我已将elems 中的最后一个元素修改为以下内容:['S', ${dt.getUTCSeconds()}.${dt.getUTCMilliseconds()}]
    【解决方案2】:

    你可以这样做:

    // Duration 1 hour
    var duration = moment.duration(1, 'h');
    console.log( duration.asMilliseconds() )   // 3600000
    
    // Convert to ISO8601 duration string
    console.log( duration.toISOString() )      // "PT1H"
    

    另外,5 分钟,例如:

    var duration = moment.duration(5, 'm');
    console.log( duration.asMilliseconds() )   // 300000
    
    // Convert to ISO8601 duration string
    console.log( duration.toISOString() )      // "PT5M"
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-04
      • 2013-10-05
      • 2011-03-31
      • 1970-01-01
      相关资源
      最近更新 更多