2013-06-17 2 views
4

что у меня есть два часа в формате строки, и мне нужно, чтобы вычислить разницу в JavaScript, пример:Как рассчитать разницу во времени между строк в JavaScript,

а = «10:22:57»

b = "10:30:00"

разница = 00:07:03?

+0

создать два Diff объекты даты, вычитать меньшее из большего (или используйте Math.abs(), чтобы гарантировать, что Вы получаете положительное число) , конвертировать ms в часы: min: seconds –

+1

Немного поиска не повредит ... [Это для того, чтобы знать, как преобразовать String в Date] (http://stackoverflow.com/questions/5619202/converting-string-to -date-in-js) и [это для вычитания двух дат/времени один f rom другой] (http: // stackoverflow.com/questions/1787939/check-time-difference-in-javascript) – RaphaelDDL

+2

Обработка дат и времени в Javascript достаточно, чтобы водить сильных мужчин, чтобы выпить. Это один из тех случаев, когда «использовать библиотеку» вполне может быть правильным ответом, если у вас есть что-то даже смутно сложное, что вам нужно сделать. – lonesomeday

ответ

12

Хотя использование Date или библиотеки отлично (и, вероятно, проще), вот пример того, как это сделать «вручную» с небольшим количеством математики. Идея заключается в следующем:

  1. Разбор строки, извлечение часа, минут и секунд.
  2. Вычислить общее количество секунд.
  3. Вычитайте оба числа.
  4. Отформатировать как hh:mm:ss.

Пример:

function toSeconds(time_str) { 
    // Extract hours, minutes and seconds 
    var parts = time_str.split(':'); 
    // compute and return total seconds 
    return parts[0] * 3600 + // an hour has 3600 seconds 
      parts[1] * 60 + // a minute has 60 seconds 
      +parts[2];  // seconds 
} 

var difference = Math.abs(toSeconds(a) - toSeconds(b)); 

// compute hours, minutes and seconds 
var result = [ 
    // an hour has 3600 seconds so we have to compute how often 3600 fits 
    // into the total number of seconds 
    Math.floor(difference/3600), // HOURS 
    // similar for minutes, but we have to "remove" the hours first; 
    // this is easy with the modulus operator 
    Math.floor((difference % 3600)/60), // MINUTES 
    // the remainder is the number of seconds 
    difference % 60 // SECONDS 
]; 

// formatting (0 padding and concatenation) 
result = result.map(function(v) { 
    return v < 10 ? '0' + v : v; 
}).join(':'); 

DEMO

+0

Сколько времени вам понадобилось, чтобы подумать о таком решении! Кажется, что много работы :) – James111

+0

Я больше не помню. Я также не знаю, почему я не использовал Date. Может быть, я просто хотел доказать, что это возможно без него :) –

+0

Я использовал этот код, используя 'Date', который я создал, и он отлично работает! :) – James111

4

Сделайте два Date объектов из них. Тогда вы можете сравнить.

Получите значение из обеих дат, которые вы хотите сравнить, и сделайте вычитание. Как это (предположим, foo и bar финики):

var totalMilliseconds = foo - bar; 

Это даст вам количество миллисекунд между обоими. Некоторая математика преобразует это в дни, часы, минуты, секунды или все, что вы хотите использовать. Например:

var seconds = totalMilliseconds/1000; 
var hours = totalMilliseconds/(1000 * 3600); 

Что касается получения Date от string, вы должны смотреть в конструктор (проверьте первую ссылку), а также использовать его в том, что подходит вам лучше всего. Счастливое кодирование!

+0

на самом деле, вы можете просто вычесть объекты Date, так как .valueOf() сопоставляется с .getTime() ... – dandavis

+0

@dandavis Спасибо. Я не знаю, что было у меня в голове, когда я это написал. Исправлено сейчас. – Renan

+1

@Koki w3schools - ужасный ресурс. Использовать MDN: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date –

2

очень простой способ, если у вас всегда будет меньше, чем за 12 часов:

a = "10:22:57"; 
b = "10:30:00"; 
p = "1/1/1970 "; 

difference = new Date(new Date(p+b) - new Date(p+a)).toUTCString().split(" ")[4]; 
alert(difference); // shows: 00:07:03 

, если вам нужно для форматирования более 12 часов, это сложнее сделать, # MS между датами правильна с использованием этой математики ...

Смежные вопросы