2009-11-24 2 views
75

Как бы вы определили разницу во времени от двух текстовых полей в Javascript?Проверить разницу во времени в Javascript

+2

Какой формат пользователь, входящего в раз? –

+2

Являются ли они двумя текстовыми полями, содержащими ТОЛЬКО значения времени? Например, «11:42 вечера» или «8:09 утра»? –

+2

да, как то же, что и сказал – Kishh

ответ

136

Импровизировать. Вычтите код JavaScript Date объекты, чтобы получить их разность:

// use a constant date (e.g. 2000-01-01) and the desired time to initialize two dates 

var date1 = new Date(2000, 0, 1, 9, 0); // 9:00 AM 
var date2 = new Date(2000, 0, 1, 17, 0); // 5:00 PM 

// the following is to handle cases where the times are on the opposite side of 
// midnight e.g. when you want to get the difference between 9:00 PM and 5:00 AM 

if (date2 < date1) { 
    date2.setDate(date2.getDate() + 1); 
} 

var diff = date2 - date1; 

// 28800000 milliseconds (8 hours) 

Вы можете конвертировать миллисекунды в час, минуты и секунды, как это:

var msec = diff; 
var hh = Math.floor(msec/1000/60/60); 
msec -= hh * 1000 * 60 * 60; 
var mm = Math.floor(msec/1000/60); 
msec -= mm * 1000 * 60; 
var ss = Math.floor(msec/1000); 
msec -= ss * 1000; 
// diff = 28800000 => hh = 8, mm = 0, ss = 0, msec = 0 

Вы можете конвертировать время в виде строки в 24-часовой формат:

function parseTime(s) { 
    var part = s.match(/(\d+):(\d+)(?:)?(am|pm)?/i); 
    var hh = parseInt(part[1], 10); 
    var mm = parseInt(part[2], 10); 
    var ap = part[3] ? part[3].toUpperCase() : null; 
    if (ap === "AM") { 
     if (hh == 12) { 
      hh = 0; 
     } 
    } 
    if (ap === "PM") { 
     if (hh != 12) { 
      hh += 12; 
     } 
    } 
    return { hh: hh, mm: mm }; 
} 
parseTime("12:00 AM"); // {hh: 0, mm: 0} 
parseTime("12:00 PM"); // {hh: 12, mm: 0} 
parseTime("01:00 PM"); // {hh: 13, mm: 0} 
parseTime("23:00"); // {hh: 23, mm: 0} 
+0

Я никогда не знаю, будут ли даты в этом формате анализироваться как d/m/y или m/d/y. Официальные форматы принимаются здесь (независимо от того, что принимает Date.parse()), https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Date/parse –

+0

что здесь +1? Какая часть даты - это увеличение? –

+0

Я знаю, что это древний, но где во всем этом тарабарщине что-нибудь читается из полей формы? Все, что я вижу, это код с жестким кодом. Как я могу получить разницу между тем, что мой пользователь набрал в мои два 'input type =" text "' поля, а не между 9:00 и 17:00? – Martha

5

Хорошее решения является имеющимся в

http://blogs.digitss.com/javascript/calculate-datetime-difference-simple-javascript-code-snippet/

дает выход в желаемый формате из

Всё различия

дней: часы: минуты: секунды.

Слегка модифицированная версия этого кода показан ниже

var vdaysdiff; // difference of the dates 
    var vhourDiff; 
    var vmindiff; 
    var vsecdiff; 

    vdaysdiff = Math.floor(diff/1000/60/60/24); // in days 
    diff -= vdaysdiff*1000*60*60*24; 

    vhourDiff = Math.floor(diff/1000/60/60); // in hours 
    diff -= vhourDiff*1000*60*60; 

    vmindiff = Math.floor(diff/1000/60); // in minutes 
    diff -= vmindiff*1000*60; 

    vsecdiff= Math.floor(diff/1000); // in seconds 

    //Text formatting 
    var hourtext = '00'; 
    if (hourDiff > 0){ hourtext = String(hourDiff);} 
    if (hourtext.length == 1){hourtext = '0' + hourtext};                

    var mintext = '00';       
    if (mindiff > 0){ mintext = String(mindiff);} 
    if (mintext.length == 1){mintext = '0' + mintext}; 

    //shows output as HH:MM (i needed shorter duration) 
    duration.value= hourtext + ':' + mintext; 
6

Вот мое исполнение ....

function get_time_difference(earlierDate, laterDate) 
{ 
    var oDiff = new Object(); 

    // Calculate Differences 
    // ------------------------------------------------------------------- // 
    var nTotalDiff = laterDate.getTime() - earlierDate.getTime(); 

    oDiff.days = Math.floor(nTotalDiff/1000/60/60/24); 
    nTotalDiff -= oDiff.days * 1000 * 60 * 60 * 24; 

    oDiff.hours = Math.floor(nTotalDiff/1000/60/60); 
    nTotalDiff -= oDiff.hours * 1000 * 60 * 60; 

    oDiff.minutes = Math.floor(nTotalDiff/1000/60); 
    nTotalDiff -= oDiff.minutes * 1000 * 60; 

    oDiff.seconds = Math.floor(nTotalDiff/1000); 
    // ------------------------------------------------------------------- // 

    // Format Duration 
    // ------------------------------------------------------------------- // 
    // Format Hours 
    var hourtext = '00'; 
    if (oDiff.days > 0){ hourtext = String(oDiff.days);} 
    if (hourtext.length == 1){hourtext = '0' + hourtext}; 

    // Format Minutes 
    var mintext = '00'; 
    if (oDiff.minutes > 0){ mintext = String(oDiff.minutes);} 
    if (mintext.length == 1) { mintext = '0' + mintext }; 

    // Format Seconds 
    var sectext = '00'; 
    if (oDiff.seconds > 0) { sectext = String(oDiff.seconds); } 
    if (sectext.length == 1) { sectext = '0' + sectext }; 

    // Set Duration 
    var sDuration = hourtext + ':' + mintext + ':' + sectext; 
    oDiff.duration = sDuration; 
    // ------------------------------------------------------------------- // 

    return oDiff; 
} 
+1

Примечание: длительность отсутствует # дней – okigan

+0

hourtext использует oDiff.days , а часы не используются для вычисления продолжительности. – aguaviva

14

Эта функция возвращает строку с отличием от строки даты и времени и текущее время и время.

function get_time_diff(datetime) 
{ 
    var datetime = typeof datetime !== 'undefined' ? datetime : "2014-01-01 01:02:03.123456"; 

    var datetime = new Date(datetime).getTime(); 
    var now = new Date().getTime(); 

    if(isNaN(datetime)) 
    { 
     return ""; 
    } 

    console.log(datetime + " " + now); 

    if (datetime < now) { 
     var milisec_diff = now - datetime; 
    }else{ 
     var milisec_diff = datetime - now; 
    } 

    var days = Math.floor(milisec_diff/1000/60/(60 * 24)); 

    var date_diff = new Date(milisec_diff); 

    return days + " Days "+ date_diff.getHours() + " Hours " + date_diff.getMinutes() + " Minutes " + date_diff.getSeconds() + " Seconds"; 
} 

Испытано в Google Chrome console (нажмите F12)

get_time_diff() 
1388534523123 1375877555722 
"146 Days 12 Hours 49 Minutes 27 Seconds" 
+0

Как получить временное различие между датой = «2016/03/01 11:00» до даты = «2016/03/06 11:00». а также как мне сформировать дату для функции выше –

+0

http://momentjs.com/ будет решать ваши проблемы при работе со временем и датами в javascript –

+0

http://momentjs.com/docs/#/displaying/difference/ Это когда вам нужно рассчитать разницу между объектами момента –

2

Когда я попытался разница между той же отметкой времени он дал 0 дней 5 часов 30 минут

так точно получить его я вычитал 5 часов и 30 мин

function get_time_diff(datetime) 
{ 
var datetime = typeof datetime !== 'undefined' ? datetime : "2014-01-01 01:02:03.123456"; 

var datetime = new Date(datetime).getTime(); 
var now = new Date().getTime(); 

if(isNaN(datetime)) 
{ 
    return ""; 
} 

console.log(datetime + " " + now); 

if (datetime < now) { 
    var milisec_diff = now - datetime; 
}else{ 
    var milisec_diff = datetime - now; 
} 

var days = Math.floor(milisec_diff/1000/60/(60 * 24)); 

var date_diff = new Date(milisec_diff); 

return days + "d "+ (date_diff.getHours() - 5) + "h " + (date_diff.getMinutes() - 30) + "m"; 
} 
2

Это дополнение к dmd733 ответ. Я исправил ошибку с продолжительностью дня (ну, надеюсь, я это сделал, не смог проверить каждый случай).

Я также быстро добавил свойство String к результату, который содержит общее время (извините за плохой вложенный ifs !!). Например, если он используется для пользовательского интерфейса и указывает, когда что-то было обновлено (например, RSS-канал). Вид из места, но хорошо бы иметь:

function getTimeDiffAndPrettyText(oDatePublished) { 

    var oResult = {}; 

    var oToday = new Date(); 

    var nDiff = oToday.getTime() - oDatePublished.getTime(); 

    // Get diff in days 
    oResult.days = Math.floor(nDiff/1000/60/60/24); 
    nDiff -= oResult.days * 1000 * 60 * 60 * 24; 

    // Get diff in hours 
    oResult.hours = Math.floor(nDiff/1000/60/60); 
    nDiff -= oResult.hours * 1000 * 60 * 60; 

    // Get diff in minutes 
    oResult.minutes = Math.floor(nDiff/1000/60); 
    nDiff -= oResult.minutes * 1000 * 60; 

    // Get diff in seconds 
    oResult.seconds = Math.floor(nDiff/1000); 

    // Render the diffs into friendly duration string 

    // Days 
    var sDays = '00'; 
    if (oResult.days > 0) { 
     sDays = String(oResult.days); 
    } 
    if (sDays.length === 1) { 
     sDays = '0' + sDays; 
    } 

    // Format Hours 
    var sHour = '00'; 
    if (oResult.hours > 0) { 
     sHour = String(oResult.hours); 
    } 
    if (sHour.length === 1) { 
     sHour = '0' + sHour; 
    } 

    // Format Minutes 
    var sMins = '00'; 
    if (oResult.minutes > 0) { 
     sMins = String(oResult.minutes); 
    } 
    if (sMins.length === 1) { 
     sMins = '0' + sMins; 
    } 

    // Format Seconds 
    var sSecs = '00'; 
    if (oResult.seconds > 0) { 
     sSecs = String(oResult.seconds); 
    } 
    if (sSecs.length === 1) { 
     sSecs = '0' + sSecs; 
    } 

    // Set Duration 
    var sDuration = sDays + ':' + sHour + ':' + sMins + ':' + sSecs; 
    oResult.duration = sDuration; 

    // Set friendly text for printing 
    if(oResult.days === 0) { 

     if(oResult.hours === 0) { 

      if(oResult.minutes === 0) { 
       var sSecHolder = oResult.seconds > 1 ? 'Seconds' : 'Second'; 
       oResult.friendlyNiceText = oResult.seconds + ' ' + sSecHolder + ' ago'; 
      } else { 
       var sMinutesHolder = oResult.minutes > 1 ? 'Minutes' : 'Minute'; 
       oResult.friendlyNiceText = oResult.minutes + ' ' + sMinutesHolder + ' ago'; 
      } 

     } else { 
      var sHourHolder = oResult.hours > 1 ? 'Hours' : 'Hour'; 
      oResult.friendlyNiceText = oResult.hours + ' ' + sHourHolder + ' ago'; 
     } 
    } else { 
     var sDayHolder = oResult.days > 1 ? 'Days' : 'Day'; 
     oResult.friendlyNiceText = oResult.days + ' ' + sDayHolder + ' ago'; 
    } 

    return oResult; 
} 
8

Вот решение, которое работает для меня:

var date1 = new Date("08/05/2015 23:41:20"); 
var date2 = new Date("08/06/2015 02:56:32"); 

var diff = date2.getTime() - date1.getTime(); 

var msec = diff; 
var hh = Math.floor(msec/1000/60/60); 
msec -= hh * 1000 * 60 * 60; 
var mm = Math.floor(msec/1000/60); 
msec -= mm * 1000 * 60; 
var ss = Math.floor(msec/1000); 
msec -= ss * 1000; 

alert(hh + ":" + mm + ":" + ss); 
0

Мне нравится делать это через Эпохи.

var now = new Date(); 
var future = new Date(now.setMinutes(15)); 

var futureEpoch = moment(future).unix(); 
var nowEpoch = moment(now).unix(); 
var differenceInEpoch = nowEpoch - scheduledEpoch ; 

console.log("futureEpoch  : " + futureEpoch); 
console.log("nowEpoch    : " + nowEpoch); 
console.log("differenceInEpoch  : " + differenceInEpoch); 

var diffTime = new Date(0); // The 0 there is the key, which sets the date to the epoch 
diffTime.setUTCSeconds(differenceInEpoch); 
console.log("new diffTime : " + diffTime); 
-1

захватить входные значения после отправки формы

$start_time = $_POST('start_time'); 
 
$end_time =$_POST('end_time'); 
 

 
$start = $start_time; 
 
$end = $end_time; 
 

 
$datetime1 = new DateTime($end); 
 
$datetime2 = new DateTime($start); 
 
//echo $datetime1->format('H:i:s'); 
 
$interval = $datetime1->diff($datetime2); 
 
$elapsed = $interval->format('%h:%i'); 
 
$time = explode(":",$elapsed); 
 
$hours = $time[0]; 
 
$minutes = $time[1]; 
 
$tminutes = $minutes + ($hours*60);

переменного $ tminutes это общая разница в минутах, рабочий час составляет $ Hour

+0

Ваш код не работает. – Mistalis

+0

, с какой ошибкой вы столкнулись, он отлично работает для меня! –

+0

Вопрос автор хочет знать, как это сделать в js, поэтому em i. –

2

Времени различий в миллисекунды

firstDate.getTime() - secondDate.getTime() 
0

В моем случае я собираюсь хранить время в миллисекундах на хромовом хранилище и попытаться найти diff через несколько часов.

function timeDiffInHours(milliseconds){ 
    time_diff = (new Date).getTime() - milliseconds 
    return parseInt((time_diff/(1000*60*60)) % 24) 
} 

// This is again sending current time and diff would be 0. 
timeDiffInHours((new Date).getTime()); 
0

Я сделал некоторые усовершенствования для счетчика таймера

//example return : 01:23:02:02 
//    : 1 Day 01:23:02:02 
//    : 2 Days 01:23:02:02 


function get_timeDifference(strtdatetime) { 
    var datetime = new Date(strtdatetime).getTime(); 
    var now = new Date().getTime(); 

    if (isNaN(datetime)) { 
     return ""; 
    } 

    //console.log(datetime + " " + now); 

    if (datetime < now) { 
     var milisec_diff = now - datetime; 
    } else { 
     var milisec_diff = datetime - now; 
    } 

    var days = Math.floor(milisec_diff/1000/60/(60 * 24)); 

    var date_diff = new Date(milisec_diff); 





    var msec = milisec_diff; 
    var hh = Math.floor(msec/1000/60/60); 
    msec -= hh * 1000 * 60 * 60; 
    var mm = Math.floor(msec/1000/60); 
    msec -= mm * 1000 * 60; 
    var ss = Math.floor(msec/1000); 
    msec -= ss * 1000 


    var daylabel = ""; 
    if (days > 0) { 
     var grammar = " "; 
     if (days > 1) grammar = "s " 
     var hrreset = days * 24; 
     hh = hh - hrreset; 
     daylabel = days + " Day" + grammar ; 
    } 


    // Format Hours 
    var hourtext = '00'; 
    hourtext = String(hh); 
    if (hourtext.length == 1) { hourtext = '0' + hourtext }; 

    // Format Minutes 
    var mintext = '00'; 
    mintext = String(mm); 
    if (mintext.length == 1) { mintext = '0' + mintext }; 

    // Format Seconds 
    var sectext = '00'; 
    sectext = String(ss); 
    if (sectext.length == 1) { sectext = '0' + sectext }; 

    var msectext = '00'; 
    msectext = String(msec); 
    msectext = msectext.substring(0, 1); 
    if (msectext.length == 1) { msectext = '0' + msectext }; 

    return daylabel + hourtext + ":" + mintext + ":" + sectext + ":" + msectext; 
} 
0

Я хотел бы использовать только getTime(); и, например Date.now() вернуть разницу в миллисекундах:

//specified date: 

var oneDate = new Date("November 02, 2017 06:00:00"); 

//number of milliseconds since midnight Jan 1 1970 till specified date 

var oneDateMiliseconds = oneDate.getTime(); 

////number of milliseconds since midnight Jan 1 1970 till now 

var currentMiliseconds = Date.now(); 

//return time difference in miliseconds 

alert(currentMiliseconds-oneDateMiliseconds); 
Смежные вопросы