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