2010-11-08 88 views
11
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); 

这是我用来计算给定用户输入日期的失效日期的Javascript代码。目前,有效期为original date minus one day and original year minus X从Date对象中减去日/月/年

这段代码的问题,首先它没有考虑到无效日期。例如,如果用户提供的日期是'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); 

但更多的问题......首先,该代码变得有点令人费解。其次,这项检查必须在当天完成。然后是月份。有更清洁,更简单的方法吗?

此外,还有一些情况需要计算到该日期的'月底'到期日。例如:

Expiry date is: +3 years 

User date is: '14/10/2010' 
Expiry date is: '31/10/2013' 

我希望在Date object将支持这些计算,但根据https://developer.mozilla.org/en/JavaScript/Reference/global_objects/date,似乎不...

+0

momentjs.com使得这种方式更容易:http://momentjs.com/ – bernie2436 2016-03-09 14:25:51

回答

3
var currentDate = new Date(year,month,day); 
var expiryDate = new Date(); 
expiryDate.setTime(currentDate.getTime() + (3 * 365 * 24 * 60 * 60 * 1000)); 

使用过去的秒数1970年是罚款这样的: - ) 哦,你有更多的规则。好之后,你仍然要检查这些案件...

+1

对不起,我不能完全肯定这是如何工作的?什么是每个数字代表什么?我如何使用它计算给定日期之上的+4年? – dave 2010-11-08 07:11:04

11

简单的方法,看看是否inputed日期为有效日期:

var d = Date.parse('4/20/2010'); 
if (isNaN(d.valueOf())) { 
alert ("bad date value"); 
} 

然后,这里是我经常使用的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; 
    } 
} 

然后只需使用:

var d = new Date(); 
d.dateAdd('day', -1).dateAdd('year', 3); 

T'da

+0

我认为这个答案是最好的解决方案,你在这个例子中解析的日期是蛋糕上的小锦上添花。谢谢! – TaeKwonJoe 2013-11-08 03:04:30

+0

只是一个方面的评论,验证是好的,但不要用分析的变量d调用原型。你显然需要将这个实例化成一个Date对象。否则,你会得到愚蠢的错误,“dateAdd,不存在”。 var d = Date(); d.dateAdd('day',-1)。dateAdd('year',3); – MiloTheGreat 2014-03-14 10:42:41

+0

我认为这是不正确的解决方案。 我想要的人应该是18岁,然后根据出生日期。 试图从当前日期(2014年3月28日)减去18年,此解决方案返回到1996年2月28日。 我穿过从http://www.timeanddate.com/date/dateadded.html?d1=28&m1=3&y1=2014&type=sub&ay=18&am=&aw=&ad= 和 HTTP验证的答案:// WWW。 calculator.net/date-calculator.html?today2=03%2F28%2F2014&c2op=-&c2year=18&c2month=0&c2week=0&c2day=0&calctype=op&x=98&y=11 我得到的日期是28日至1996年 所以我认为缺少某些东西。 – 2014-03-28 15:28:53

5

类似的问题已经在这里找到答案:

How to add/subtract dates with javascript?

类似的事情可以做几个月和几年。

例如,

 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);