我正在尝试创建一个简单的脚本,根据2011年7月6日星期三开始的双周计划为我提供下一个回收日期。所以我创建了这个简单的函数......
function getNextDate(startDate) {
if (today <= startDate) {
return startDate;
}
// calculate the day since the start date.
var totalDays = Math.ceil((today.getTime()-startDate.getTime())/(one_day));
// check to see if this day falls on a recycle day
var bumpDays = totalDays%14; // mod 14 -- pickup up every 14 days...
// pickup is today
if (bumpDays == 0) {
return today;
}
// return the closest day which is in 14 days, less the # of days since the last
// pick up..
var ms = today.getTime() + ((14- bumpDays) * one_day);
return new Date(ms);
}
可以称之为......
var today=new Date();
var one_day=1000*60*60*24; // one day in milliseconds
var nextDate = getNextDate(new Date(2011,06,06));
到目前为止一切都那么好......但是当我将“今天”投射到2011年10月27日时,我将于2011年11月11日星期二作为下一个日期,而不是2011年11月9日星期三...事实上每个从现在起到10/26/2011的那一天预测正确的接送......并且从2011年10月27日到2012年2月28日的每个日期都是星期二而不是星期三。然后每个日期从2012年2月29日(闰年)到2012年10月24日(10月再次),正确地预测周三。我错过了什么?任何帮助将不胜感激..
V
答案 0 :(得分:34)
最简单的方法是使用Date
更新setDate
对象。由于此答案的评论表明这不是规范的正式部分,但它在所有主流浏览器上都受支持。
您应该从不更新与原始Date
电话上的对象不同的getDate
对象。
示例实施:
var incrementDate = function (date, amount) {
var tmpDate = new Date(date);
tmpDate.setDate(tmpDate.getDate() + amount)
return tmpDate;
};
如果您尝试增加日期,请使用此功能。它将接受正面和负面的价值观。它还保证不更改使用的日期对象。这样可以防止在您不希望更新更改对象值时可能发生的任何错误。
使用不正确:
var startDate = new Date('2013-11-01T11:00:00');
var a = new Date();
a.setDate(startDate.getDate() + 14)
这将根据startDate
的值更新a
的“日期”值14天。由于a
的值与先前定义的startDate
不同,因此可能会得到错误的值。
答案 1 :(得分:4)
扩展Exellian的答案,如果你想计算未来的任何时期(在我的情况下,在下一个付款日期),你可以做一个简单的循环:
var today = new Date();
var basePayDate = new Date(2012, 9, 23, 0, 0, 0, 0);
while (basePayDate < today) {
basePayDate.setDate(basePayDate.getDate()+14);
}
var nextPayDate = new Date(basePayDate.getTime());
basePayDate.setDate(nextPayDate.getDate()-14);
document.writeln("<p>Previous pay Date: " + basePayDate.toString());
document.writeln("<p>Current Date: " + today.toString());
document.writeln("<p>Next pay Date: " + nextPayDate.toString());
假设核心日期服务按预期工作,这不会遇到奇怪的问题。我不得不承认,未来很多年我都没有测试过它......
答案 2 :(得分:2)
注意:我有类似的问题;我想每周创建一系列日期,即,开始日期为10/23/2011,并持续12周。我的代码或多或少是这样的:
var myDate = new Date(Date.parse(document.eventForm.startDate.value));
var toDate = new Date(myDate);
var week = 60 * 60 * 24 * 7 * 1000;
var milliseconds = toDate.getTime();
dateArray[0] = myDate.format('m/d/Y');
for (var count = 1; count < numberOccurrences; count++) {
milliseconds += week;
toDate.setTime(milliseconds);
dateArray[count] = toDate.format('m/d/Y');
}
因为我没有指定时间而且我住在美国,我的默认时间是午夜,所以当我越过夏令时边界时,我搬到了前一天。呸。我通过设置我的时间到中午来解决它,然后才进行一周的计算。