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

Javascript 如何将小时添加到24小时格式的格式为HH:MM:SS的字符串中,javascript,datetime,time,time-format,Javascript,Datetime,Time,Time Format,我正试图以24小时的形式增加时间,比如说“23:59:59”。例如,我需要添加2.5小时,这样时间应该滚动到第二天,并显示为“02:30:00” 到目前为止,我所尝试的工作一直持续到“23:59:59”。如果超过23:59:59,我需要显示第二天的时间。以下是我迄今为止所尝试的: var time = $('#starttime').val().split(':'); var d = new Date(); d.setHours(+time[0]); d.setMinutes(time[1]);

我正试图以24小时的形式增加时间,比如说“23:59:59”。例如,我需要添加2.5小时,这样时间应该滚动到第二天,并显示为“02:30:00”

到目前为止,我所尝试的工作一直持续到“23:59:59”。如果超过23:59:59,我需要显示第二天的时间。以下是我迄今为止所尝试的:

var time = $('#starttime').val().split(':');
var d = new Date();
d.setHours(+time[0]);
d.setMinutes(time[1]);
d.setSeconds(time[2]);
var time2 = $('#endtime').val().split(':');
var endtimeval = new Date();
endtimeval.setHours(+time2[0]);
endtimeval.setMinutes(time2[1]);
endtimeval.setSeconds(time2[2]);
var str = d.getHours() + parseInt($('#noofhours').val()) + ":" + time2[1] + ":" + time2[2];
$('#endtime').val(str);

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

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"
请注意,由于没有涉及日期,因此无法准确处理例如夏令时。还请注意,在本例中,分钟是向下舍入的,如果需要,您可以重复几秒钟的逻辑


请注意,基于相同的原因,使用日期对象的方法将根据逻辑运行的时间/地点,为相同的输入提供不同的答案。

制作自定义日期加法器

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原则,自己重构代码。但是它会根据您的要求完成工作。

您可以在这里相当轻松地使用普通的JavaScript日期方法。大部分工作是解析时间字符串输入,然后连接时间字符串输出。例如:

let start='23:59:59';
让加法='2.5';
让[hh,mm,ss]=start.split(':').map(x=>parseInt(x));
设d=新日期(new Date().setHours(hh,mm+(add*60),ss));
让end=`${d.getHours()}:${d.getMinutes()}:${d.getSeconds()}`;
控制台日志(结束);

//2:29:59
我做的一个简单技巧是将输入为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.

与其手工操作,不如研究一下库选项,比如@raphinese comment的+1。我使用的是Moment.js,它使所有这类东西都变得简单,而且你也不太可能出现错误或边缘情况。你能帮我用普通javascript做同样的事情吗。我不是在使用任何第三方js文件和CDN的状态。希望你已经理解了。请至少创建一个你的代码。例如,现在我不知道你所说的2.5小时应该隐藏在什么地方。(虽然setHours可能无法正确处理2.5这样的值,因此使用该方法设置分钟可能更容易,而将2.5*60作为值。)@SPYder-我读了评论,但不清楚你认为我会在那里看到什么,从而改变答案。请随意详细说明。请注意,您使用日期对象的方法将根据逻辑运行的时间/地点对相同的输入给出不同的答案。@JaredSmith,谢谢您的评论。但是这个逻辑是按照我需要的时区来工作的。@benvc,以小时为单位的时间,它可能是浮点数,比如2.3,需要以24小时的格式加上字符串,比如“HH:MM:SS”,比如“23:59:59”。这是我需要做的事情,也是我在上面解释的。@SPYder-除非我误解了你,否则上面的答案会处理浮点值,并将它们转换为分钟进行加法。运行代码段,您将了解我的意思。注意,您使用日期对象的方法将根据逻辑运行的时间/地点为相同的输入提供不同的答案。尽管存在一些表面差异,但这与我的答案中的方法有何不同?