Как добавить часы в строку, отформатированную как ЧЧ: ММ: СС в 24-часовом формате - PullRequest
0 голосов
/ 24 января 2019

Я пытаюсь добавить часы ко времени в формате 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);

Ответы [ 4 ]

0 голосов
/ 24 января 2019

Простой трюк, который я сделал, - просто преобразовал часы, введенные как 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.
0 голосов
/ 24 января 2019

Сделать специальный сумматор даты?

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

Вы можете применить принцип СУХОЙ и самостоятельно изменить код.Но он выполнит работу согласно вашему требованию.

0 голосов
/ 24 января 2019

Здесь вы можете довольно легко использовать ванильные методы 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
0 голосов
/ 24 января 2019

Использование объекта Date здесь возможно необязательно, по арифметике по модулю должно быть достаточно.

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 даст разных ответов для одних и тех же входных данных в зависимости откогда / где работает логика, по тем же причинам.

...