如何解决简单的Javascript日期数学……不是真的
| 我正在尝试创建一个简单的脚本,该脚本基于从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月8日星期二作为下一个日期,而不是2011年9月9日星期三...实际上是每天从现在开始到2011年10月26日计划正确的接送...并且从2011年10月27日到2012年2月28日的每个日期都将预测为星期二而不是星期三。然后,从2012年2月29日(year年)到2012年10月24日(再次是hmmm,十月)的每个日期都会正确地预测星期三。我想念什么?任何帮助将不胜感激..
V
解决方法
最简单的方法是使用
setDate
更新Date
对象。正如此答案的注释表明,这并不是规范的正式组成部分,但所有主流浏览器均支持该规范。
您永远都不应更新与原来的getDate
调用对象不同的Date
对象。
实施示例:
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)
这将基于a
的值将startDate
的\“ date \”值更新14天。因为a
的值与先前定义的ѭ8not不相同,所以可能会得到错误的值。
, 扩展Exellian的答案,如果您想计算将来的任何时期(在我的情况下,对于下一个支付日期),可以执行一个简单的循环:
var today = new Date();
var basePayDate = new Date(2012,9,23,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());
假设核心日期服务按预期工作,这不会遇到奇怪的问题。我不得不承认,我在未来很多年都没有对其进行测试...
, 注意:我有一个类似的问题。我想每周创建一系列日期,即开始日期2011年10月23日,持续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\');
}
因为我没有指定时间,并且我居住在美国,所以我的默认时间是午夜,所以当我越过夏令时时,我搬到了前一天。 uck我通过将我的时间设置为中午之前进行周计算来解决此问题。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。