2014-09-29 53 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()); 
} 

我的表格下面的JavaScript函数看起来是这样的

<?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> 

这个脚本作品每个用户点击超链接“下的”时间精细递增一个星期,问题与一个月边界发生。当日期为“2014-09-27”时,脚本会正确计算下一个日期并显示“2014-10-04”。当下次点击发生问题时,一旦下一次脚本失败,月份发生改变。我不明白为什么,我试着提醒start_date,它是正确的“2014-10-04”,但是一旦执行新的Date命令,它会返回一个无效的日期。

奇怪的是,它不会在月份边界上失败(这实际上得到正确计算),但它在下一次失败。我认为它可能与当前月份有关,但无关紧要,如果我将start_date设置为“2014-11-03”,它将继续正确添加,直到显示日期“2014-12-01”,但是将在下一次失败。

任何帮助是极大的赞赏

回答

1

您的问题是,浏览器期望2014-09-272014-9-27 instend。

这将解决这个问题:

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 2014-09-30 03:31:25

+0

我刚刚用'new Date(“2014-9-27”)''进行了测试。 Chrome和Node接受它,Firefox和IE10则不接受。 – dusky 2014-09-30 07:14:48

1

一个日期加上一个星期,简化为:

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

它不闰秒,夏令开关和其他日历干扰工作,虽然。

编辑:

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,仍然是同样的问题,直到月份更改并失败 – 2014-09-29 07:41:38

+0

由失败我的意思是var myDate返回“无效日期”,如果我alert(myDate),因此试图获得NaN的年或月失败的日期 – 2014-09-29 08:08:32

+0

如果你运行你的代码,它会在11月份成功,它会给出12月1日的适当日期,然后开始给出无效日期,只需要通过月,直到它改变,然后“下一次”它会给无效的日期 – 2014-09-29 08:11:27