2013-08-30 2 views
2

Редактировать: Я попробовал некоторые из предложений в ответ ниже, но я до сих пор не получаю соответствующих результатов. Любая дополнительная помощь будет оценена по достоинству.Вычисление разрыва между предыдущей датой окончания и следующей датой начала в javascript

Я внедрил форму в HTML, которая принимает 2 даты в качестве входных данных, и они добавляются в два массива. Затем я вычисляю разницу между двумя датами в месяцах.

a) Форма запрашивает у пользователя свою пятилетнюю историю, и поэтому пользователь должен иметь возможность вводить даты, пока он/она не обогатит пять лет (60 месяцев). Для этого вопроса, я попробовал функцию ниже:

if (typeof startArray[index] !== 'null' && endArray[index] !== null) { 
var result = difference_between(dateFrom, dateTo); 
document.getElementById("txtResult").value = result 
if(result <= 60) { 
document.getElementById('datepicker1').reset(); 
document.getElementById('datepicker2').reset(); 
document.getElementById('txtResult').reset(); 
} 
else{ 
alert("Go to the next section"); 
document.getElementById('btnSave').disable = true; 
} 

б) Форма должна быть в состоянии вычислить промежуток между датой окончания и следующей датой начала и не должна быть разрывом более чем на два месяца. Например, форма должна иметь возможность сравнить дату окончания школы с датой начала работы uni и если она больше 2 месяцев, тогда я должен сообщить об ошибке. Вот моя функция:

function GetDifference() { 
var dateFrom = new Date(document.getElementById("datepicker1").value); 
var dateTo = new Date(document.getElementById("datepicker2").value); 
document.getElementById("txtResult").value = difference_between(dateFrom, dateTo); 

//Is there a gap of more than 2 months? 
if (endDate.length && (difference_between(endDate[endDate.length - 1], dateFrom)) > 2) { 
    window.alert("There should not be a gap of more than two months in this section."); 
} 
} 

вот JSFIDDLE: http://jsfiddle.net/stelios13/KsuxV/111/

Спасибо.

+0

Итак, вам нужно знать, как получить разницу в месяцах между двумя датами? Ваш вопрос очень длинный. Возможно, создайте новый, который будет короче с соответствующим кодом. – Halcyon

+0

Я получил разницу в месяцах. Дело в том, что мне нужно вычислить разрыв между предыдущей датой окончания (INDEX 0 в endArray и индексом 1 в стартовом массиве. Также мне нужно остановить вход, когда пользователь использует пятилетний предел (60 месяцев) –

+0

Возможно, это будет актуально здесь: http://stackoverflow.com/questions/3224834/get-difference-between-2-dates-in-javascript –

ответ

1

startDate.splice(0,1)удаляет первый элемент в startDate, у меня такое ощущение, что это не то, что вы хотите. Я бы сделал чек, как это:

function GetDifference() { 
    var dateFrom = new Date(document.getElementById("datepicker1").value); 
    var dateTo = new Date(document.getElementById("datepicker2").value); 
    document.getElementById("txtResult").value = difference_between(dateFrom, dateTo); 

    // Right now the things in endDate are strings so this won't work, but see below 
    if(endDate.length && (difference_between(endDate[endDate.length - 1], dateFrom)) > 2){ 
     window.alert("There should not be a gap of more than two months in this section. Plsease fill in your details appropriately"); 
     document.getElementById("btnSave").disabled = true; 
    } 
} 

... Сначала я должен быть уверен, что endDate не пусто, то я получаю последнюю дату в endDate и сравнить его с dateFrom. Это то, что вы ищете?

Вы можете сделать что-то подобное, чтобы проверить диапазон в пять лет: сначала убедитесь, что startDate и endDate не пусты, а затем сравнить первую дату в startDate (startDate[0]) с последней датой в endDate (endDate[endDate.length - 1]).


Кстати, в JavaScript даты можно преобразовать в числа (как количество миллисекунд с произвольной начальной точки, 1 января 1970):

// The unary `+` operator converts its operand to a number: 
console.log(+new Date()); // Just now, logged 1377880989982 

Это отличная возможность для их сравнения:

// How many milliseconds in a month? 
var month = 1000 * 60 * 60 * 24 * 365.25/12; 
// Subtraction also converts its operands to numbers: 
console.log(
    Math.round((new Date('2013-06-01') - new Date('2013-01-01'))/month) 
); // Logs 4.96 

Итак, между 1 января и 1 июня существует около пяти месяцев. Если в вашем случае вы хотите быть немного более человечным (и убедитесь, что номер месяца не более двух раз), то, как вы их сравниваете, все в порядке.


Еще один маленький совет: если вы собираетесь сравнивать эти даты позже, вы можете хранить Date с в массивах, а не строк. И .push() является более распространенным способом, чтобы добавить что-то к массиву, чем присваивание arr[arr.length]:

// I would change the beginning of insert() to something like this: 
function insert() { 
    var newStartDate = new Date(document.getElementById('datepicker1').value); 
    var newEndDate = new Date(document.getElementById('datepicker2').value); 
    startDate.push(newStartDate); 
    endDate.push(newEndDate); 

    // … 
} 
+0

Большое спасибо за ваш совет. Я попытаюсь внедрить ваше решение в свой код. Тем не менее, я до сих пор не понимаю первый фрагмент кода. Дело в том, чтобы рассчитать разницу между датой окончания (например, датой окончания школы) и датой начала университета. Итак, я не знаю, может ли быть полезным первый элемент в массиве startDate. Представьте, что первая дата в массиве - это дата начала школы. Тогда мне это не нужно. Если я хочу рассчитать разницу даты, в которой я закончил школу, с датой, которую я запустил uni –

+0

Эй @ AndreUk13. Я не использую 'startDate' вообще в своей первой части кода, что вы имеете в виду? Выше этого я упомянул 'startDate.splice (0,1)', который у вас есть в вашем коде и, вероятно, не должен (поскольку он удаляет первый элемент в 'startDate'). Я упомянул «startDate [0]» в отношении вашей пятилетней истории: сравнение «startDate [0]» с «endDate [endDate.length - 1]» было бы хорошим способом получить общий временной интервал всего, что было до сих пор. – s4y

+0

@ AndreUk13 Просто чтобы убедиться, что мы говорим об одном и том же, мой первый фрагмент кода сравнивает «endDate [endDate.length - 1]' с 'dateFrom', правильно? – s4y

0

Может moment.js может быть полезным для вас.Это js-библиотека для работы с датами, а также функция diff.

+0

Благодарю вас за предложение! –