2014-09-29 3 views
0

У меня есть следующий яваскрипт функция, которая должна добавить в неделю до даты формы и сохранить его в виде на следующий раз, когда пользователь нажимает на ссылкеJavascript добавить дни к заданной дате

function changeDate() 
{ 
    var start = document.getElementById('start_date').value; 
    var d = 7; 
    var myDate=new Date(start); 
    myDate.setDate(myDate.getDate()+parseInt(d)); 
    document.getElementById('start_date').value = (myDate.getFullYear()) + '-' + (myDate.getMonth()+1) + '-' + (myDate.getDate()); 
} 

Моей форму выглядит что-то вроде этого

<?php 
    $start_date = "2014-09-20"; 
?> 
<form name="myForm" method="post"> 
<input type="text" name="start_date" id="start_date" value="<?php echo $start_date?>"/> 
<a href="#" onclick="changeDate();">Next</a> 
</form> 

Этот скрипт работает отлично увеличивающимся в неделю каждый раз, когда пользователь нажимает на гиперссылку «Next», проблема происходит с месяца границей. Когда дата «2014-09-27», скрипт правильно вычисляет следующую дату и отображает «2014-10-04». Проблема возникает при следующем щелчке, как только месяц изменился при следующем сбое сценария. Я не понимаю, почему, я попытался предупредить start_date, и это правильно «2014-10-04», но как только выполнить новую команду Date, она возвращает недопустимую дату.

Странно то, что он не терпит неудачу на границе месяца (это действительно правильно рассчитано), но в следующий раз это не удастся. Я думал, что это может быть связано с текущим месяцем, но это не имеет значения, если я начну с start_date, установленного на «2014-11-03», он будет продолжать правильно добавлять до тех пор, пока я не покажу дату «2014-12-01», но в следующий раз не удастся.

Любая помощь очень ценится

ответ

1

Ваша проблема в том, что браузер ожидает 2014-09-27 instend of 2014-9-27.

Это исправить:

function padNumber(num, length) { 
var str = num + ""; 
while (str.length < length) { 
    str = "0" + str; 
} 
return str; 
} 

function changeDate() 
{ 
    var start = document.getElementById('start_date').value; 
    var d = 7; 
    var myDate=new Date(start); 
    myDate.setDate(myDate.getDate()+parseInt(d)); 

    document.getElementById('start_date').value = (myDate.getFullYear()) + '-' + padNumber(myDate.getMonth()+1, 2) + '-' + padNumber(myDate.getDate(), 2); 
} 

Лучший способ добавления дней к дате будет:

function addDays(date, days) { return new Date( date.getFullYear(), date.getMonth(), date.getDate() + days, date.getHours(), date.getMinutes(), date.getSeconds() % 60, date.getMilliseconds()); }

Еще лучше для временных манипуляций http://momentjs.com/.

+0

+1, moment.js милый. – Amadan

+0

Я только что проверил тест с новой датой («2014-9-27»). Chrome и Node принимают его, Firefox и IE10 - нет. – dusky

1

Свидание плюс неделя, упрощена, является:

var oneWeekFromMyDate = new Date(myDate.getTime() + 7 * 24 * 60 * 60 * 1000); 

Это не работает с високосных секунд, перехода на летнее переключатели и другие нарушения календаря, хотя ,

EDIT: Что касается вашего решения, он на самом деле работает без проблем на моем компьютере:

function changeDate() 
 
{ 
 
    var start = document.getElementById('start_date').value; 
 
    var d = 7; 
 
    var myDate=new Date(start); 
 
    myDate.setDate(myDate.getDate()+parseInt(d)); 
 
    document.getElementById('start_date').value = (myDate.getFullYear()) + '-' + (myDate.getMonth()+1) + '-' + (myDate.getDate()); 
 
}
<form name="myForm" method="post"> 
 
<input type="text" name="start_date" id="start_date" value="2014-11-03"/> 
 
<a href="#" onclick="changeDate();">Next</a> 
 
</form>

Если она не для вас, вы можете указать, что «провал» означает? Он меняется на случайную другую дату, он ломается и показывает сообщение об ошибке в консоли, он взрывает корову на заднем дворе?

+0

Я попытался использовать миллисекунды, такие как ваше решение, и getTime вместо getDate, по-прежнему такая же проблема, преуспевает до тех пор, пока месяц не изменится и не сработает. –

+0

По ошибке я имею в виду, что var myDate возвращает «Недействительная дата», если я предупреждаю (myDate) и, следовательно, пытаюсь получить год или месяц или день не удалось с NaN –

+0

Если вы запустите свой код, он будет преуспевать до тех пор, пока месяц будет ноябрь, он даст правильную дату 1 декабря, после чего он начнет давать недействительную дату, просто пройдите через месяц до тех пор, пока он не изменится, а затем «следующее» время будет выдано Недействительная дата –

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