javascript中的毫秒数

IT技术 javascript jquery
2021-03-19 15:33:19

我有这个功能可以格式化秒到时间

 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
6个回答

其他答案中有很多不必要的地板。如果字符串以毫秒为单位,则转换为 h:m:s 如下:

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

对我来说最好的解决方案..在带有 ionic5 的 typecritp 中工作正常
2021-05-08 15:33:19
如果 ms 值为小数,这也会失败。也许在开头附近添加 s = Math.round(s) 来解决这个问题。
2021-05-12 15:33:19
当毫秒数小于 0.1 时,此算法失败,例如 55018 应该是“55.018”但它产生“55.18”
2021-05-16 15:33:19

这是我最喜欢的单线解决方案:

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

方法Date.prototype.toISOString()以简化的扩展 ISO 格式 ( ISO 8601 )返回一个字符串,其长度始终为 24 个字符:YYYY-MM-DDTHH:mm:ss.sssZ. 所有现代浏览器 (IE9+) 和 Node.js 都支持此方法。

这种单行仅限于一天的范围,如果您使用它来格式化长达 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"

谢谢它帮助我
2021-04-29 15:33:19
@Ziarno 不确定 React Native 是如何工作的,但如果它在后面使用现代 JS 处理器,则应该执行此代码。
2021-05-01 15:33:19
这适用于小于 24 小时的毫秒。每 24 小时,小时将重新从 0 开始。
2021-05-03 15:33:19
嗯,你是对的,它确实有效。一定有不同的错误,抱歉
2021-05-04 15:33:19
@haiiaaa 你是对的,它有一个限制。请检查更新的答案,我添加了扩展的解决方案,它可以很好地处理任何以毫秒为单位的小时数。
2021-05-11 15:33:19
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;
}
@RobG 这不是关于毫秒,而是关于理查德代码中的 2 行。
2021-05-03 15:33:19
使用Math.floor分钟可能是一个好主意。
2021-05-06 15:33:19
@inhan-同意,我给了你 +1。但是 Richard 也有一个Math.floorfor ms 现在已被删除。:-)
2021-05-11 15:33:19
Math.floor 不需要毫秒。
2021-05-12 15:33:19
谁呼!这篇文章使我的声誉超过九千!
2021-05-15 15:33:19

为什么不像这样使用 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/

当我添加 18000(即 18 秒,以毫秒为单位)并调用 time.getMinutes() 时,它返回 30 分钟,time.getSeconds() 返回 18 秒,因为我看到 getMinutes 将输入视为以秒为单位。而 getSeconds 以毫秒为单位考虑它,有没有办法只传递毫秒并且 time.get**** 方法返回正确的时间。就我而言,我需要输出为 0 分 18 秒。
2021-04-27 15:33:19
@RajshekarReddy 我使用 UTC getter 解决了这个问题。
2021-05-13 15:33:19
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;
}