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

Il s'agit du code Javascript que j'utilise pour calculer une date d'expiration en fonction d'une date saisie par l'utilisateur. Actuellement, la date d'expiration est original date minus one day and original year minus X.Soustraction de jours/mois/années d'un objet Date

Les problèmes avec ce code, tout d'abord, il ne prend pas en compte les dates non valides. Par exemple, si la date fournie par l'utilisateur est '1/10/2010', la date d'expiration sera '0/10/2013' (en supposant que la date d'expiration est +3 ans).

que je pouvais faire quelque chose comme:

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

Mais plus de problèmes se posent ... Tout d'abord, le code est un peu alambiquée. Deuxièmement, cette vérification devrait être effectuée le jour même. et puis le mois. Y a-t-il un moyen plus propre et plus simple?

En outre, il y a une certaine circonstance qui impliquerait que je doive calculer la date d'expiration à la «fin du mois» pour cette date. Par exemple:

Expiry date is: +3 years 

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

J'espérais que le Date object soutiendrait ces calculs mais selon https://developer.mozilla.org/en/JavaScript/Reference/global_objects/date, il ne semble pas ...

+0

momentjs.com rend ainsi plus facile: http://momentjs.com/ – bernie2436

Répondre

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

en utilisant le nombre de secondes passées 1970 est très bien pour cela: - oh, vous avez plus de règles. bien après que vous devrez toujours vérifier les cas ...

+1

Désolé, je ne suis pas tout à fait sûr de savoir comment cela fonctionne ... Qu'est-ce que chaque numéro représente? Comment calculer +4 ans en plus d'une date donnée? – dave

11

moyen facile de voir si une date inputed est une date valide:

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

Ensuite, voici une fonction dateAdd que j'utilise régulièrement. Prolonge l'objet Date, il est donc facile à utiliser:

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

Ensuite il suffit d'utiliser:

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

T'da

+0

Je pense que cette réponse est la meilleure solution et la date à laquelle vous analysez l'exemple est un peu de cerise sur le gâteau. Merci! – TaeKwonJoe

+0

Juste un commentaire de côté, la validation est bonne, mais n'appelez pas le prototype avec la variable analysée d. Vous devez évidemment instancier ceci dans un objet Date. Sinon, vous obtiendrez des erreurs loufoques, de "dateAdd, n'existe pas". var d = Date(); d.dateAjoute ('jour', -1).dateAdd ('année', 3); – MiloTheGreat

+0

Je pense que ce n'est pas une solution correcte. Je voulais que la personne soit âgée, puis 18 ans selon la date de naissance. a tenté de soustraire 18 ans de la date actuelle (28-mars-2014), cette solution est retournée 28-Février-1996. I Cross réponse Verified de http://www.timeanddate.com/date/dateadded.html?d1=28&m1=3&y1=2014&type=sub&ay=18&am=&aw=&ad= et 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 La date je suis arrivé était de 28 Mars 1996 Je pense que quelque chose manque. –

5

Une question similaire a été répondu ici:

How to add/subtract dates with javascript?

Une chose semblable peut être faite pendant des mois et des années.

Par exemple.

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