JavaScript中的毫秒转换为时间

77

我有一个函数,它将秒格式化为时间

 function secondsToTime(secs){
    var hours = Math.floor(secs / (60 * 60));
    var divisor_for_minutes = secs % (60 * 60);
    var minutes = Math.floor(divisor_for_minutes / 60);
    var divisor_for_seconds = divisor_for_minutes % 60;
    var seconds = Math.ceil(divisor_for_seconds);
    return minutes + ":" + seconds; 
}

代码工作得很好,但我需要一个将毫秒值转换为时间的函数。我无法理解如何修改这个函数以返回指定格式的时间。

mm:ss.mill
01:28.5568

3
让我们来看看,1秒等于1000毫秒,因此... - epascarello
1
就我所知,1000毫秒等于一秒,那么怎么可能在毫秒区域有一个4位数呢? - inhan
19个回答

145

其他答案中有很多不必要的内容。如果字符串表示毫秒数,可以按照以下方式转换为小时:分:秒:

function msToTime(s) {
  var ms = s % 1000;
  s = (s - ms) / 1000;
  var secs = s % 60;
  s = (s - secs) / 60;
  var mins = s % 60;
  var hrs = (s - mins) / 60;

  return hrs + ':' + mins + ':' + secs + '.' + ms;
}

如果您想将其格式化为hh:mm:ss.sss,则可以使用:

function msToTime(s) {

  // Pad to 2 or 3 digits, default is 2
  function pad(n, z) {
    z = z || 2;
    return ('00' + n).slice(-z);
  }

  var ms = s % 1000;
  s = (s - ms) / 1000;
  var secs = s % 60;
  s = (s - secs) / 60;
  var mins = s % 60;
  var hrs = (s - mins) / 60;

  return pad(hrs) + ':' + pad(mins) + ':' + pad(secs) + '.' + pad(ms, 3);
}

console.log(msToTime(55018))

使用最近添加的语言特性,pad函数可以更加简洁:

function msToTime(s) {
    // Pad to 2 or 3 digits, default is 2
  var pad = (n, z = 2) => ('00' + n).slice(-z);
  return pad(s/3.6e6|0) + ':' + pad((s%3.6e6)/6e4 | 0) + ':' + pad((s%6e4)/1000|0) + '.' + pad(s%1000, 3);
}

// Current hh:mm:ss.sss UTC
console.log(msToTime(new Date() % 8.64e7))


当毫秒小于0.1时,例如55018应该是"55.018",但该算法会输出"55.18",因此该算法失败。 - Joe Germuska
如果ms值是小数,则此方法也会失败。也许在开头附近添加s = Math.round(s)可以解决这个问题。 - Blorf
最适合我的解决方案..在Ionic5中使用TypeScript运行良好。 - Betini O. Heleno

78

这是我最喜欢的一行代码解决方案:

new Date(12345 * 1000).toISOString().slice(11, -1);  // "03:25:45.000"

Date.prototype.toISOString()方法会返回一个字符串,采用简化的扩展 ISO 8601 格式,字符串长度始终为24个字符:YYYY-MM-DDTHH:mm:ss.sssZ。该方法在所有现代浏览器(包括IE9+)和Node中均可使用。

这个一行代码只能将毫秒格式化到24小时以内的时间范围内(即ms < 86400000),但如果你需要正确格式化任意数量的毫秒数,请使用下面这段代码,它提供了方便的原型方法:

/**
 * Convert (milli)seconds to time string (hh:mm:ss[:mss]).
 *
 * @param Boolean seconds
 *
 * @return String
 */
Number.prototype.toTimeString = function(seconds) {
    var _24HOURS = 8.64e7;  // 24*60*60*1000

    var ms = seconds ? this * 1000 : this,
        endPos = ~(4 * !!seconds),  // to trim "Z" or ".sssZ"
        timeString = new Date(ms).toISOString().slice(11, endPos);

    if (ms >= _24HOURS) {  // to extract ["hh", "mm:ss[.mss]"]
        var parts = timeString.split(/:(?=\d{2}:)/);
        parts[0] -= -24 * Math.floor(ms / _24HOURS);
        timeString = parts.join(":");
    }

    return timeString;
};

console.log( (12345 * 1000).toTimeString()     );  // "03:25:45.000"
console.log( (123456 * 789).toTimeString()     );  // "27:03:26.784"
console.log(  12345.       .toTimeString(true) );  // "03:25:45"
console.log(  123456789.   .toTimeString(true) );  // "34293:33:09"


@Ziarno 不确定React Native是如何工作的,但如果它在后台使用现代JS处理器,那么这段代码应该可以执行。 - VisioN
嗯,你说得对,它确实可以工作。可能是有其他的错误,抱歉。 - Ziarno
这适用于小于24小时的毫秒。每24小时,小时将重新从0开始计算。 - haiiaaa
@haiiaaa 你说得对,它有限制。请查看更新的答案,我已经添加了扩展解决方案,可以很好地处理以毫秒为单位的任何小时数。 - VisioN
谢谢,它帮助了我。 - Vision Coderz
好的,这一定是最简短的解决方案。我最终得到了这个 new Date(MILLISECONDS).toISOString().slice(14, -1).split('.').join(':'),它为我提供了所需的 mm:ss:SSS 格式,用于动画播放。 - Hooman Askari

26
function millisecondsToTime(milli)
{
      var milliseconds = milli % 1000;
      var seconds = Math.floor((milli / 1000) % 60);
      var minutes = Math.floor((milli / (60 * 1000)) % 60);

      return minutes + ":" + seconds + "." + milliseconds;
}

2
使用 Math.floor 函数来处理 分钟 可能是个好主意。 - inhan
毫秒不需要使用Math.floor。 - RobG
@RobG,这不是关于毫秒的问题,而是关于Richard代码中的两行。 - inhan
@inhan - 同意,我给了你+1。但是Richard也对毫秒使用了Math.floor,现在已经删除了。 :-) - RobG
哇塞!这篇帖子让我的声望超过九千了! - Richard J. Ross III

16

为什么不像这样使用Date对象呢?

let getTime = (milli) => {
  let time = new Date(milli);
  let hours = time.getUTCHours();
  let minutes = time.getUTCMinutes();
  let seconds = time.getUTCSeconds();
  let milliseconds = time.getUTCMilliseconds();
  return hours + ":" + minutes + ":" + seconds + ":" + milliseconds;
}

https://jsfiddle.net/4sdkpso7/6/


1
当我加上18000(即18秒的毫秒数)并调用time.getMinutes()时,它返回30分钟,而time.getSeconds()返回18秒,因为我看到getMinutes将输入视为秒。而getSeconds将其视为毫秒,有没有一种方法只传递毫秒,time.get****方法返回正确的时间。在我的情况下,我需要输出为0分钟18秒。 - Rajshekar Reddy
@RajshekarReddy 我通过使用UTC getters解决了那个问题。 - sissonb

3

优点:

  • 简洁清晰的代码,易于根据您的需求进行修改
  • 支持任意数量的小时数(>24小时也可以)
  • 将时间格式化为00:00:00.0

您可以将其放入助手文件中

export const msecToTime = ms => {
  const milliseconds = ms % 1000
  const seconds = Math.floor((ms / 1000) % 60)
  const minutes = Math.floor((ms / (60 * 1000)) % 60)
  const hours = Math.floor((ms / (3600 * 1000)) % 3600)
  return `${hours < 10 ? '0' + hours : hours}:${minutes < 10 ? '0' + minutes : minutes}:${
    seconds < 10 ? '0' + seconds : seconds
  }.${milliseconds}`
}

3

这里有一个使用的过滤器:

app.filter('milliSecondsToTimeCode', function () {
    return function msToTime(duration) {
        var milliseconds = parseInt((duration % 1000) / 100)
            , seconds = parseInt((duration / 1000) % 60)
            , minutes = parseInt((duration / (1000 * 60)) % 60)
            , hours = parseInt((duration / (1000 * 60 * 60)) % 24);

        hours = (hours < 10) ? "0" + hours : hours;
        minutes = (minutes < 10) ? "0" + minutes : minutes;
        seconds = (seconds < 10) ? "0" + seconds : seconds;

        return hours + ":" + minutes + ":" + seconds + "." + milliseconds;
    };
});

只需将它添加到你的表达式中,如下所示。
{{milliseconds | milliSecondsToTimeCode}}

3
function millisecondsToTime(millisecs){
  var ms = Math.abs(millisecs) % 1000;
  var secs = (millisecs < 0 ? -1 : 1) * ((Math.abs(millisecs) - ms) / 1000);
  ms = '' + ms;
  ms = '000'.substring(ms.length) + ms;
  return secsToTime(secs) + '.' + ms;
}

2

编辑RobG的解决方案并使用JavaScript的Date()函数。

function msToTime(ms) {

    function addZ(n) {
        return (n<10? '0':'') + n;
    }
    var dt = new Date(ms);
    var hrs = dt.getHours();
    var mins = dt.getMinutes();
    var secs = dt.getSeconds();
    var millis = dt.getMilliseconds();

    var tm = addZ(hrs) + ':' + addZ(mins) + ':' + addZ(secs) + "." + millis;
    return tm;
}

实际上这是个不好的想法,因为它会添加与协调世界时(UTC)的小时差异,对时间持续性来说并不好。 - Konstantin Pribluda

1
const monthNames = ["Jan", "Feb", "Mar", "Apr", "May", "Jun",
 "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"
];
export function getFormattedDateAndTime(startDate) {
    if (startDate != null) {
      var launchDate = new Date(startDate);
       var day = launchDate.getUTCDate();
      var month = monthNames[launchDate.getMonth()];
      var year = launchDate.getFullYear(); 
      var min = launchDate.getMinutes();
      var hour = launchDate.getHours();
      var time = launchDate.toLocaleString('en-US', { hour: 'numeric', minute: 'numeric', hour12: true });

      return  day + " " + month + " " + year + " - " + time + ""  ;
    }
    return "";
   }

1
function msToTime(s) {

  var d = new Date(s); 
  var datestring = ("0" + d.getDate()).slice(-2) + "-" + ("0"+(d.getMonth()+1)).slice(-2) + "-" +
    d.getFullYear() + " " 
    + ("0" + d.getHours()).slice(-2) 
    + ":" + ("0" + d.getMinutes()).slice(-2)
    + ":" + ("0" + d.getSeconds()).slice(-2)
    +"."+d.getMilliseconds();

  return datestring;      

}

输出 16-10-2019 18:55:32.605


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接