如何以24小时格式将小时添加到格式为HH:MM:SS的字符串中

时间:2019-01-24 14:20:53

标签: javascript datetime time time-format

我正在尝试以24小时的格式添加小时,例如“ 23:59:59”。例如,我需要添加2.5个小时,因此时间应滚动到第二天,并显示为“ 02:30:00”。

到目前为止,我尝试过的方法一直有效,直到达到“ 23:59:59”。如果第二天的时间超过了“ 23:59:59”,则需要显示第二天的时间。到目前为止,这是我尝试过的:

try_parse([date] as date using 'en-US')

4 个答案:

答案 0 :(得分:1)

在这里使用日期对象可能是不必要的,取模运算就足够了。

const pad = n => {
  const s = String(n);
  return s.length > 1 ? s : '0' + s;
};

const addHours = (timeVal, numHours) => {
  const [hr, min, sec] = timeVal.split(':').map(Number);
  const [,lefty, righty] = String(numHours).match(/(\d+)(?:(\.\d+))?/).map(Number);
  const hours = (hr + lefty) % 24;
  const minutes = righty === undefined ? 
    min : 
    ((righty * 60 | 0) + min) % 60;

  return [hours, minutes, sec].map(pad).join(':');  
};

addHours('23:59:59', 2.5) // "01:29:59"

请注意,由于不涉及日期,因此无法准确处理例如夏令时。另外请注意,在本示例中,分钟是四舍五入的,如果需要,您可以将逻辑重复几秒钟。

请注意,出于相同的原因,根据逻辑运行的时间/位置,使用Date对象的方法将针对相同的输入给出不同的答案

答案 1 :(得分:0)

创建自定义日期添加器?

const add = (time, hours) => {
  let [hh, mm, ss] = time.split(':');

  const seconds = hours * 60 * 60;

  ss = ss * 1 + seconds;
  if (ss >= 60) { 
      mm = mm * 1 + ss / 60; 
      ss = (ss % 60).toPrecision(2).padStart(2, '0');
  }

  if (mm >= 60) {
    hh = hh * 1 + mm / 60;
    mm = (mm % 60).toPrecision(2).padStart(2, '0');
  }

  hh = (Math.floor(hh) % 24).toString().padStart(2, '0');

  return hh + ':' + mm + ':' + ss;
}

console.log(add("23:59:59", 2.5));

您可以应用DRY原理并自己重构代码。但是它将根据您的要求完成工作。

答案 2 :(得分:0)

您可以在此处相当轻松地使用原始JavaScript Date方法。大多数工作是解析时间字符串输入,然后串联时间字符串输出。例如:

let start = '23:59:59';
let add = '2.5';

let [hh, mm, ss] = start.split(':').map(x => parseInt(x));
let d = new Date(new Date().setHours(hh, mm + (add * 60), ss));
let end = `${d.getHours()}:${d.getMinutes()}:${d.getSeconds()}`;
console.log(end);
// 2:29:59

答案 3 :(得分:0)

我做的一个简单的技巧就是将乘以float / int输入的小时数乘以60并创建一个日期,将其转换为分钟值,然后再加上我已经拥有的时间。 这里是最少步骤的解决方案:

var time = $('#endtime').val().split(':');
    var d = new Date(); 
    d.setHours(+time[0]); 
    d.setMinutes(time[1]); 
    d.setSeconds(time[2]);
    var addeddate = new Date();
    addeddate.setMinutes(parseFloat($('#noofhours').val()) * 60);
    $('#endtime').val(("0" + (addeddate.getHours())).slice(-2) + ":" + ("0" + (addeddate.getMinutes())).slice(-2) + ":" + ("0" + (addeddate.getSeconds())).slice(-2)); //The answer that I needed in endtime id value.