2016-02-24 5 views
0

Я создал веб-страницу, которая вычисляет недели и дни между двумя датами. В chrome эта страница работает и дает мне выход 4 недели и два дня для дат 01/01/2016 и 31/31/2016, но firefox дает мне выход из 130 недель и двух дней. Как бы мне это изменить, чтобы получить выход из хрома. Большое спасибоФормат даты в формате Firefox

<html> 
<head> 
<title>Time Between Dates Calculator</title> 
<script src="dateCalc.js"></script> 
</head> 
<body> 
<h1>Calculate the Amount of Time Between Dates:</h1> 
<form> 
Enter Date 1 (mm/dd/yyyy): <input type="date" id="date1" name="date1" required> <br /> 
Enter Date 2 (mm/dd/yyyy): <input type="date" id="date2" name="date2" required> <br /> 
<input type="submit" onclick="datecalc()" Value="Get Weeks and days"> 

</form> 
</body> 
</html> 



*********************************************************************** 

function datecalc() 
{ 
    firstDate = document.getElementById("date1").value; 
    secondDate = document.getElementById("date2").value; 
    /*window.alert(firstDate); 
    window.alert(secondDate);*/ 
    firstDateMs = new Date(firstDate).getTime(); 
    secondDateMs = new Date(secondDate).getTime(); 

    msPerDay = 24 * 60 * 60 * 1000; 
    msLeft = (secondDateMs - firstDateMs); 
    daysLeft = Math.round(msLeft/msPerDay); 
    weeksLeft = Math.round(daysLeft/7); 
    total = (daysLeft-(weeksLeft*7)) 

    window.alert("The difference between these days is: " + weeksLeft + " weeks and " + total + " days."); 



} 
+0

JFYI, для отладки используйте 'console.log (...);' вместо 'window.alert (...);'. – Legionar

+1

Вы сказали, что дата 2d 31/01/2016 и введите дату: mm/dd/yyyy? – artm

+0

Вы не должны округлять недели, только дни. – RobG

ответ

2

одно решение заключается в использовании .split("/") на ваших входных строк, а затем использовать new Date(year, month, day); конструктор.

Также январь является 0 и декабрь 11 Дата Javascript https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Date

это устранит любую двусмысленность от возможной интерпретации строки даты.

firstDate = document.getElementById("date1").value; 
secondDate = document.getElementById("date2").value; 
/*window.alert(firstDate); 
window.alert(secondDate);*/ 
firstDate.split("/"); 
secondDate.split("/"); 
firstDateMs = new Date(parseInt(firstDate[2]), parseInt(firstDate[0]) - 1, parseInt(firstDate[1])).getTime(); 
secondDateMs = new Date(parseInt(secondDate[2]), parseInt(secondDate[0]) - 1, parseInt(secondDate[1])).getTime(); 
+0

Это теперь ничего не возвращает после попадания submit, любых идей? –

+0

Извините, я пропустил инструкцию по форме, заявив, что будет введен как mm/dd/yyyy, я обновлю ответ –

+0

Теперь я получу это: «Разница между этими днями: NaN недели и дни NaN». Спасибо за вашу помощь. –

0

Подающий заявку должен быть в форме, а не в кнопке отправки, так как форма может быть отправлена ​​без нажатия кнопки. Кроме того, строки даты должны обрабатываться вручную в соответствии с датами и, поскольку они зависят от ввода пользователя, значения проверяются. Это также может облегчить жизнь, если обработчик передает ссылку на форму, поэтому управление доступом осуществляется по имени, а не по getElementById.

Дата ввода типа не поддерживается и создает больше проблем, чем она решает сейчас, поэтому лучше использовать текст типа (или использовать собственный выбор даты). В следующем тексте вводится текст типа ввода и вручную анализируется и проверяется строка в формате m/d/y.

Для реальной формы было бы лучше проверить каждую дату отдельно и поместить сообщение об ошибке для некоей недействительной единицы, а также эхо-версию синтаксического анализа на экран, чтобы пользователь мог видеть, что код использует дату, как они ожидают (например, 1/2/2016 выходит 2 января не 1 февраля).

Некоторый код ...

function datecalc(form) { 
 
    var d1 = parseMDY(form.date1.value); 
 
    var d2 = parseMDY(form.date2.value); 
 
    var msDay = 8.64e7; 
 
    var msWeek = msDay * 7; 
 
    var result; 
 
    
 
    // Deal with in valid input 
 
    if (isNaN(+d1) || isNaN(+d2)) { 
 
    result = 'Invalid date'; 
 
    } else { 
 
    
 
    // Get weeks and days 
 
    var diff = d2 - d1; 
 
    result = (diff/msWeek | 0) + ' weeks ' + 
 
      Math.round((diff % msWeek)/msDay | 0) + ' days'; 
 
    } 
 
    
 
    // Should return an array of say [weeks, days] and leave formatting 
 
    // to some other function. 
 
    form.result.value = result; 
 
} 
 

 
function parseMDY(s) { 
 
    var b = s.split(/\D/); 
 
    var d = new Date(b[2], --b[0], b[1]); 
 
    return d && d.getMonth() == b[0]? d : new Date(NaN); 
 
}
<form onsubmit="datecalc(this); return false;"> 
 
    Enter Date 1 (mm/dd/yyyy): <input type="text" name="date1" value="3/1/2016"><br> 
 
    Enter Date 2 (mm/dd/yyyy): <input type="text" name="date2" value="3/23/2016"><br> 
 
    <input type="reset"> <input type="submit" Value="Get Weeks and days"><br> 
 
    <input type="text" name="result" readonly> 
 
</form>

Я думаю, вы округлять дни для удаления ошибок сохранения дневного света, будьте осторожны с этим. Альтернативой является получение разницы в днях от значений даты, а не создание объектов даты вообще. Это устраняет любые проблемы с DST (но проверка дат занимает около 3 строк больше кода).

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