dav*_*ave 12 javascript math datetime
var inputDate = '20/4/2010'.split('/');
var dateFormatted = new Date(parseInt(inputDate[2]), parseInt(inputDate[1]), parseInt(inputDate[0]));
var expiryDate = (dateFormatted.getDate() - 1) + '/' + dateFormatted.getMonth() + '/' + (dateFormatted.getFullYear() + year);
Run Code Online (Sandbox Code Playgroud)
这是我用来根据用户输入日期计算到期日期的Javascript代码.目前,到期日是original date minus one day and original year minus X
.
这段代码存在问题,首先,它没有考虑无效日期.例如,如果用户提供的日期是"2010年1月10日",则到期日期将为"0/10/2013"(假设有效期为+ 3年).
我可以这样做:
var inputDate = '20/4/2010'.split('/');
var day = parseInt(inputDate[0]);
var month = parseInt(inputDate[1]);
var year = parseInt(inputDate[2]);
if (day < 1)
{
if (month == ...)
{
day = 31
month = month - 1;
}
else
{
day = 30
month = month - 1;
}
}
var dateFormatted = new Date(parseInt(inputDate[2]), parseInt(inputDate[1]), parseInt(inputDate[0]));
var expiryDate = (dateFormatted.getDate() - 1) + '/' + dateFormatted.getMonth() + '/' + (dateFormatted.getFullYear() + year);
Run Code Online (Sandbox Code Playgroud)
但是出现了更多的问题......首先,代码有点复杂.其次,这项检查必须在当天进行.然后是月份.有更清洁,更简单的方法吗?
此外,还有某种情况需要我计算该日期"月末"的到期日期.例如:
Expiry date is: +3 years
User date is: '14/10/2010'
Expiry date is: '31/10/2013'
Run Code Online (Sandbox Code Playgroud)
我希望Date object
能支持这些计算但是根据https://developer.mozilla.org/en/JavaScript/Reference/global_objects/date,它似乎不是......
小智 12
轻松查看输入日期是否为有效日期:
var d = Date.parse('4/20/2010');
if (isNaN(d.valueOf())) {
alert ("bad date value");
}
Run Code Online (Sandbox Code Playgroud)
然后,这是我经常使用的dateAdd函数.扩展Date对象,因此易于使用:
Date.prototype.dateAdd = function(size,value) {
value = parseInt(value);
var incr = 0;
switch (size) {
case 'day':
incr = value * 24;
this.dateAdd('hour',incr);
break;
case 'hour':
incr = value * 60;
this.dateAdd('minute',incr);
break;
case 'week':
incr = value * 7;
this.dateAdd('day',incr);
break;
case 'minute':
incr = value * 60;
this.dateAdd('second',incr);
break;
case 'second':
incr = value * 1000;
this.dateAdd('millisecond',incr);
break;
case 'month':
value = value + this.getUTCMonth();
if (value/12>0) {
this.dateAdd('year',value/12);
value = value % 12;
}
this.setUTCMonth(value);
break;
case 'millisecond':
this.setTime(this.getTime() + value);
break;
case 'year':
this.setFullYear(this.getUTCFullYear()+value);
break;
default:
throw new Error('Invalid date increment passed');
break;
}
}
Run Code Online (Sandbox Code Playgroud)
然后使用:
var d = new Date();
d.dateAdd('day', -1).dateAdd('year', 3);
Run Code Online (Sandbox Code Playgroud)
T'da
这里回答了类似的问题:
类似的事情可以持续数月和数年.
例如
var date = new Date('2011','01','02');
alert('the original date is '+date);
var newdate = new Date(date);
newdate.setMonth(newdate.getMonth() - 7);
var nd = new Date(newdate);
alert('the new date is '+nd);
Run Code Online (Sandbox Code Playgroud)
var currentDate = new Date(year,month,day);
var expiryDate = new Date();
expiryDate.setTime(currentDate.getTime() + (3 * 365 * 24 * 60 * 60 * 1000));
Run Code Online (Sandbox Code Playgroud)
使用 1970 过去的秒数就可以了:-)哦,你有更多的规则。之后你仍然需要检查这些情况......