Вычислить разницу по времени с помощью JavaScript

У меня есть два поля ввода HTML, для которых нужно рассчитать разницу во времени в JavaScript onBlur (так как мне это нужно в реальном времени) и вставить результат в новое поле ввода.

Пример формата: 10:00 и 12:30 мне нужно: 02:30

Спасибо!

Ответ 1

Вот одно из возможных решений:

function diff(start, end) {
    start = start.split(":");
    end = end.split(":");
    var startDate = new Date(0, 0, 0, start[0], start[1], 0);
    var endDate = new Date(0, 0, 0, end[0], end[1], 0);
    var diff = endDate.getTime() - startDate.getTime();
    var hours = Math.floor(diff / 1000 / 60 / 60);
    diff -= hours * 1000 * 60 * 60;
    var minutes = Math.floor(diff / 1000 / 60);

    // If using time pickers with 24 hours format, add the below line get exact hours
    if (hours < 0)
       hours = hours + 24;

    return (hours <= 9 ? "0" : "") + hours + ":" + (minutes <= 9 ? "0" : "") + minutes;
}

DEMO: http://jsfiddle.net/KQQqp/

Ответ 2

Ну, эта работа почти великолепна. Теперь используйте этот код для расчета: 23:50 - 00:10 И посмотрите, что вы получите. Или даже 23:30 - 01:30. Это беспорядок. Поскольку получение ответа в php происходит иначе:

$date1 = strtotime($_POST['started']);
$date2 = strtotime($_POST['ended']);
$interval = $date2 - $date1;
$playedtime = $interval / 60;

Но все же, он работает как ваш. Думаю, вам нужно также ввести даты?

И снова: мои тяжелые исследования и разработки помогли мне.

if (isset($_POST['calculate'])) {
$d1 = $_POST['started'];
$d2 = $_POST['ended'];
if ($d2 < $d1) {
    $date22 = date('Y-m-');
    $date222 = date('d')-1;
    $date2 = $date22."".$date222;
} else {
$date2 = date('Y-m-d');
}
$date1 = date('Y-m-d');
$start_time = strtotime($date2.' '.$d1);
$end_time = strtotime($date1.' '.$d2); // or use date('Y-m-d H:i:s') for current time
$playedtime = round(abs($start_time - $end_time) / 60,2);
}

И как вы вычислите время на следующий день. // редактировать. Сначала у меня была дата date1 jnd date2. Мне нужно -1, потому что этот расчет приходит только на следующий день, а первая дата вчера была.

После улучшения и много мозговой силы с моим другом мы подошли к этому:

$begin=mktime(substr($_GET["start"], 0,2),substr($_GET["start"], 2,2),0,1,2,2003);
$end=mktime(substr($_GET["end"], 0,2),substr($_GET["end"], 2,2),0,1,3,2003);
$outcome=($end-$begin)-date("Z");
$minutes=date("i",$outcome)+date("H",$outcome)*60; //Echo minutes only
$hours = date("H:i", $outcome); //Echo time in hours + minutes like 01:10 or something.

Таким образом, вам действительно нужно всего 4 строки кода, чтобы получить результат. Вы можете взять минуты или показать полный рабочий день (например, разница 02:32) 2 часа 32 минуты. Что самое главное: все же вы можете рассчитать ночь в 24-часовом режиме aka: время начала 11:50 вечера, чтобы сказать 01:00 (в 24-часовых часах 23:50 - 01:00), потому что в 12-часовом режиме все равно работает.

Что самое важное: вам не нужно форматировать ввод. Вы можете использовать только 2300 как вход 23:00. Этот script преобразует ввод текстового поля в правильный формат. Последняя script использует стандартную форму html с методом = "get", но вы также можете преобразовать ее для использования метода POST.

Ответ 3

С секунд, которые вы предоставили, не получите результат для меня, пожалуйста, найдите мою обновленную функцию, дающую вам правильные секунды здесь - By Dinesh J

function diff(start, end) {
    start = start.split(":");
    end = end.split(":");
    var startDate = new Date(0, 0, 0, start[0], start[1],start[2], 0);
    var endDate = new Date(0, 0, 0, end[0], end[1],end[2], 0);
    var diff = endDate.getTime() - startDate.getTime();
    var hours = Math.floor(diff / 1000 / 60 / 60);
    diff -= hours * 1000 * 60 * 60;
    var minutes = Math.floor(diff / 1000 / 60);
    var seconds = Math.floor(diff / 1000)-120;

    // If using time pickers with 24 hours format, add the below line get exact hours
    if (hours < 0)
        hours = hours + 24;

    return (hours <= 9 ? "0" : "") + hours + ":" + (minutes <= 9 ? "0" : "") + minutes+ ":" + (seconds <= 9 ? "0" : "") + seconds;
}

Ответ 4

Попробуйте это

var dif = ( new Date("1970-1-1 " + end-time) - new Date("1970-1-1 " + start-time) ) / 1000 / 60 / 60;

Ответ 5

Это обновленная версия той, которая уже была отправлена. Это с секундами.

function diff(start, end) {
    start = start.split(":");
    end = end.split(":");
    var startDate = new Date(0, 0, 0, start[0], start[1], 0);
    var endDate = new Date(0, 0, 0, end[0], end[1], 0);
    var diff = endDate.getTime() - startDate.getTime();
    var hours = Math.floor(diff / 1000 / 60 / 60);
    diff -= hours * (1000 * 60 * 60);
    var minutes = Math.floor(diff / 1000 / 60);
    diff -= minutes * (1000 * 60);
    var seconds = Math.floor(diff / 1000);

    // If using time pickers with 24 hours format, add the below line get exact hours
    if (hours < 0)
       hours = hours + 24;

    return (hours <= 9 ? "0" : "") + hours + ":" + (minutes <= 9 ? "0" : "") + minutes + (seconds<= 9 ? "0" : "") + seconds;
}

Моя обновленная версия:

Позволяет конвертировать даты в миллисекунды и отключать их вместо разделения.

Пример - Годы/Месяцы/Недели/Дни/Часы/Минуты/Секунды

Пример: https://jsfiddle.net/jff7ncyk/308/

Ответ 6

В зависимости от того, что вы позволяете войти, этот будет работать. Могут быть некоторые пограничные проблемы, если вы хотите разрешить 1:00 до 13:00

ПРИМЕЧАНИЕ: это НЕ использует объекты даты или moment.js

function pad(num) {
  return ("0"+num).slice(-2);
}
function diffTime(start,end) {
  var s = start.split(":"), sMin = +s[1] + s[0]*60,
      e =   end.split(":"), eMin = +e[1] + e[0]*60,
   diff = eMin-sMin;
  if (diff<0) { sMin-=12*60;  diff = eMin-sMin }
  var h = Math.floor(diff / 60),
      m = diff % 60;
  return "" + pad(h) + ":" + pad(m);
}  
document.getElementById('button').onclick=function() {
  document.getElementById('delay').value=diffTime(
      document.getElementById('timeOfCall').value, 
      document.getElementById('timeOfResponse').value
  );
}
<input type="time" id="timeOfCall">
<input type="time" id="timeOfResponse">
<button type="button" id="button">CLICK</button>
<input type="time" id="delay">

Ответ 7

   calTimeDifference(){
    this.start = dailyattendance.InTime.split(":");
    this.end = dailyattendance.OutTime.split(":");
    var time1 = ((parseInt(this.start[0]) * 60) + parseInt(this.start[1]))
    var time2 = ((parseInt(this.end[0]) * 60) + parseInt(this.end[1]));
    var time3 = ((time2 - time1) / 60);
    var timeHr = parseInt(""+time3);
    var  timeMin = ((time2 - time1) % 60);
}

Ответ 8

TimeCount = function()
{
    t++;
    var ms = t;
    if (ms == 99)
    {
        s++;
        t = 0;
        if ( s == 60)
        {
            m++;
            s = 0;
        }
    }

    Dis_ms = checkTime(ms);
    Dis_s = checkTime(s);
    Dis_m = checkTime(m);
    
    document.getElementById("time_val").innerHTML = Dis_m + ":" + Dis_s+ ":" + Dis_ms;
}

function checkTime(i) 
{
  if (i<10) {
    i = "0" + i;
  }
  return i;
} 

Ответ 9

Попробуйте это: на самом деле это проблема с codeeval.com

Я решил это таким образом.

Эта программа принимает файл в качестве аргумента, поэтому я использовал немного node js для чтения файла.

Вот мой код.

var fs  = require("fs");
fs.readFileSync(process.argv[2]).toString().split('\n').forEach(function (line) {
    if (line !== "") {
        var arr = line.split(" ");
        var arr1 = arr[0].split(":");
        var arr2 = arr[1].split(":");
        var time1 = parseInt(arr1[0])*3600 + parseInt(arr1[1])*60 + parseInt(arr1[2]);
        var time2 = parseInt(arr2[0])*3600 + parseInt(arr2[1])*60 + parseInt(arr2[2]);
        var dif = Math.max(time1,time2) - Math.min(time1,time2);
        var ans = [];
        ans[0] = Math.floor(dif/3600);
        if(ans[0]<10){ans[0] = "0"+ans[0]}
        dif = dif%3600;
        ans[1] = Math.floor(dif/60);
        if(ans[1]<10){ans[1] = "0"+ans[1]}
        ans[2] = dif%60;
        if(ans[2]<10){ans[2] = "0"+ans[2]}
        console.log(ans.join(":"));
    }
});

Ответ 10

Для оценки времени, затрачиваемого операциями ввода-вывода, вызовами SP и т.д., нам требуется разность во времени, простейшее решение для NodeJs (консоль в процессе callback-async):

var startTime = new Date().getTime();
//This will give you current time in milliseconds since 1970-01-01

callYourExpectedFunction(param1, param2, function(err, result){
    var endTime = new Date().getTime();
    //This will give you current time in milliseconds since 1970-01-01

    console.log(endTime  - startTime)
    //This will give you time taken in milliseconds by your function

   if(err){
   }
   else{
   }
})