2012-01-06 5 views
0

У меня здесь немного кода, который вычисляет разницу в часах между двумя датами. Вид в убытке здесь. Код попал или пропустил, и я не уверен, почему.Разница между датами

var date = tr.find('td:eq(10) input').val(); 
var time = tr.find('td:eq(10) option:selected').val(); 
var d1 = parseDate(date,time); 
date = tr.find('td:eq(11) input').val(); 
time = tr.find('td:eq(11) option:selected').val(); 
var d2 = parseDate(date,time); 
var diff = d2.getTime() - d1.getTime(); 
var hoursTd = tr.find('td:eq(12)'); 
hoursTd.html((diff/3600000).toFixed(2)); 

date и time заполняются правильно, вытягиванием из DatePicker JQuery UI и простой выпадающего списка со значениями 2:30 вечера, 2:45 часов, 3:00 часов вечера, и т.д. Он отлично работает, когда дата то же, но иногда добавляет величину десять, когда дата не то же самое. Например:

01/11/2011 10:30 утра - 01/11/2011 11:00 утра = 0,50 (Correct)

01/10/2011 10:30 AM - 01/11/2011 11:00 утра = 24,50 (Correct)

01/09/2011 10:30 AM - 01/11/2011 11:00 утра = 264,50 (Некорректное)

01/08/2011 10: 30:00 - 01/11/2011 11:00 am = 264.50 (Неправильно)

01/07/2011 10:30 - 01/11/2011 11:00 утра = 96.50 (исправлено)

Редактировать, О, мой, извините. Не включал функцию parseDate.

// Date m/d/Y Time h:m a 
function parseDate(date,time) { 

date = date.split("/"); 
time = time.split(" "); 
hm = time[0].split(':'); 
if (parseInt(hm[0]) == 12) { 
    hm[0] = 0; 
} 
if (time[1] == 'pm') { 
    hm[0] = parseInt(hm[0]) + 12; 
} else { 
    hm[0] = parseInt(hm[0]); 
} 
return new Date(
    parseInt(date[2]), parseInt(date[0])-1, parseInt(date[1]), 
    hm[0], parseInt(hm[1]) 
); 
} 

Редактировать, хорошо, так что parseInt является виновником. parseInt("09") возвращает 0. Точно так же "08". Как ни странно, parseInt("07") возвращает 7. И 1-6 правильно возвращаются. Кто-то говорит Javascript.

+1

Как это 'parseDate' определены? – Gumbo

+0

Указать полный код, содержащий все определения функций ... –

+0

Сделайте еще несколько отладок: show/alert/log значения для d1 и d2, чтобы вы были уверены, что ваши настройки ввода читаются правильно. Кроме того, вы можете убедиться, что diff является положительным числом. –

ответ

1

Проблема в том, что ваш parseInt() на дату [1] использует начальный ноль.

return new Date(
    parseInt(date[2]), parseInt(date[0])-1, parseInt(date[1]), 
    hm[0], parseInt(hm[1]) 
); 

Когда вы передаете дату как 01/09/2011, то 09 в настоящее время обрабатывается как 0, а не 9.

+0

Я думаю, вы можете быть правы. Но как бы вы это объяснили? 06/09/2010 11:30 am - Пн Май 31 2010 11:30:00 GMT-0400 (EDT), 06/07/2010 11:30 - Пн Июн 07 2010 11:30:00 GMT-0400 (EDT) Могу ли я форматировать комментарии? Во всяком случае, он неправильно анализирует 09, но 07 правильно? –

+0

Ничего себе это интересно. parseInt ("09") возвращает 0, но parseInt ("07") возвращает 7. – j08691

+1

Измените параметры parseInts, чтобы указать значение. Например. parseInt (дата [1], 10) См. https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/parseInt для получения дополнительной информации. – j08691

0

date.js решает вашу проблему:

var first = Date.parse(01/09/2011 10:30 am); 
var second = Date.parse(01/11/2011 11:00 am); 
var diffMs = Math.abs(first - second) // difference in milliseconds 
Смежные вопросы