如何使用JavaScript添加毫秒

问题描述 投票:0回答:1

我正在添加两个时间字符串,以便获得h:m:s格式的单个时间字符串,还要加上毫秒。

我只管理到几秒钟。现在我也想加上毫秒我还想添加两个以上的时间字符串,即两个以上的参数

function addTimes (startTime, endTime) {
  var times = [ 0, 0, 0 ]
  var max = times.length

  var a = (startTime || '').split(':')
  var b = (endTime || '').split(':')

  // normalize time values
  for (var i = 0; i < max; i++) {
    a[i] = isNaN(parseInt(a[i])) ? 0 : parseInt(a[i])
    b[i] = isNaN(parseInt(b[i])) ? 0 : parseInt(b[i])
  }

  // store time values
  for (var i = 0; i < max; i++) {
    times[i] = a[i] + b[i]
  }

  var hours = times[0]
  var minutes = times[1]
  var seconds = times[2]

  if (seconds >= 60) {
    var m = (seconds / 60) << 0
    minutes += m
    seconds -= 60 * m
  }

  if (minutes >= 60) {
    var h = (minutes / 60) << 0
    hours += h
    minutes -= 60 * h
  }

  return ('0' + hours).slice(-2) + ':' + ('0' + minutes).slice(-2) + ':' + ('0' + seconds).slice(-2)
}

alert(addTimes('9:10:10', '1:0:0'));
javascript
1个回答
0
投票

您可以将现有函数扩展为以毫秒为单位处理当前毫秒和秒的方式,只是系数是1000而不是60。

function addTimes(startTime, endTime) {
  // Add element for milliseconds to times
  var times = [0, 0, 0, 0];
  var max = times.length;

  // Split on ':' and '.'
  var a = (startTime || '').split(/[:.]/);
  var b = (endTime || '').split(/[:.]/);

  // normalize time values
  for (var i = 0; i < max; i++) {
    a[i] = isNaN(parseInt(a[i])) ? 0 : parseInt(a[i]);
    b[i] = isNaN(parseInt(b[i])) ? 0 : parseInt(b[i]);
  }

  // store time values
  for (var i = 0; i < max; i++) {
    times[i] = a[i] + b[i];
  }

  var hours = times[0];
  var minutes = times[1];
  var seconds = times[2];
  // Add variable for milliseconds
  var milliseconds = times[3];

  // Add milliseconds first
  if (milliseconds >= 1000) {
    var s = (milliseconds / 1000) << 0;
    seconds += s;
    milliseconds -= 1000 * s;
  }

  // Continue as for original
  if (seconds >= 60) {
    var m = (seconds / 60) << 0;
    minutes += m;
    seconds -= 60 * m;
  }

  if (minutes >= 60) {
    var h = (minutes / 60) << 0;
    hours += h;
    minutes -= 60 * h;
  }

  return ('0' + hours).slice(-2) + ':' + 
         ('0' + minutes).slice(-2) + ':' + 
         ('0' + seconds).slice(-2) + '.' +
         // Add milliseconds to return
         ('00' + milliseconds).slice(-3);
}

console.log(addTimes('9:10:10.500', '1:0:55.501'));

我将简化一些操作,并删除if语句,而每次都只执行溢出操作。而且,可以使它对部分字符串和无效值的容忍度更高一些,例如

/* Add times in format h:mm:ss.sss
** return total time in same format
** Accepts partial times, first digit treated as hours
** e.g. 1:30 is equivalent to 1:30:00.000
** Invalid and missing parts treated as 0 (zero)
** @param {string} timeA : time in format h:mm:ss.sss
** @param {string} timeB : time in format h:mm:ss.sss
** @returns {string} sum of timeA and timeB in format h:mm:ss.sss
*/
function addTime(timeA, timeB) {

  // Pad function for numbers less than 100
  let z = (n, len) => ('00' + n).slice(-len);

  // Split timestamps into parts as numbers, NaN => 0
  let parts = s => String(s).split(/[:.]/).map(v => Number(v) || 0);      
  let [aH, aM, aS, aMs] = parts(timeA);
  let [bH, bM, bS, bMs] = parts(timeB);

  // Initialise total values, tx is just a placeholder
  let tH = 0, tM = 0, tS = 0, tMs = 0, tX;
  
  // Helper to add time values - omitting f just adds a + b
  let factorSum = (a, b, f) => {
    let t = (a || 0) + (b || 0);
    return f? [t / f | 0, t % f] : [0, t];
  };
  
  // Add parts in order using helper
  [tS, tMs] = factorSum(aMs, bMs, 1000);
  [tM, tS]  = factorSum(aS, bS + tS, 60);
  [tH, tM]  = factorSum(aM, bM + tM, 60);
  [tX, tH]  = factorSum(aH, bH);

  // Return formatted result
  return tH + ':' + z(tM,2) + ':' + z(tS,2) + '.' + z(tMs,3);
}

// No overflow
console.log(addTime('1:01:01.001', '2:02:02.200')); // 3:03:03.201

// Overflow mins, secs, milliseconds
console.log(addTime('1:59:59.999', '0:00:00.001')); // 2:00:00.000

// Partial times
console.log(addTime('1', '2:30:1')); // 3:30:01.000

// Missing parameter treated as 0
console.log(addTime());       // 0:00:00.000
console.log(addTime('1:15')); // 1:15:00.000

// Invalid parts treated as zero
console.log(addTime('1:15', 'foo'));    // 1:15:00.000
console.log(addTime('1:15', '2:blah:23.001')); // 3:15:23.001

如果我可以在分解过程中使用附加赋值+=,则可能会更简单,但这还不可能。 :-)

© www.soinside.com 2019 - 2024. All rights reserved.