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

Questo è il codice Javascript che sto utilizzando per calcolare una data di scadenza data una data immessa dall'utente. Attualmente la data di scadenza è original date minus one day and original year minus X.Sottrarre giorni/mesi/anni da un oggetto Data

I problemi con questo codice, in primo luogo, non tengono conto delle date non valide. Ad esempio, se la data di fornitura dell'utente è "1/10/2010", la data di scadenza sarà "0/10/2013" (supponendo che la data di scadenza sia +3 anni).

avrei potuto fare qualcosa di simile:

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

Ma più problemi sorgono ... In primo luogo, il codice diventa un po 'contorto. In secondo luogo, questo controllo dovrebbe essere fatto il giorno. e poi il mese. C'è un modo più semplice e pulito?

Inoltre, c'è una determinata circostanza che implicherebbe la necessità di calcolare la data di scadenza fino alla "fine del mese" per quella data. Per esempio:

Expiry date is: +3 years 

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

Speravo che la Date object sosterrebbe questi calcoli ma secondo https://developer.mozilla.org/en/JavaScript/Reference/global_objects/date, non sembra ...

+0

momentjs.com rende questo modo più semplice: http://momentjs.com/ – bernie2436

risposta

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

utilizzando il numero di secondi passati 1970 va bene per questo: -) oh, hai più regole. bene dopo che si sarà ancora controlla per i casi ...

+1

Mi dispiace, non sono del tutto sicuro di come funziona ... Che cosa significa ogni numero rappresenta? Come dovrei calcolare +4 anni in cima a una determinata data usando quello? – dave

11

modo semplice per vedere se una data inputed è una data valida:

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

Quindi, ecco una funzione dateAdd che uso regolarmente. Estende l'oggetto Date, quindi è facile da usare:

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

poi basta usare:

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

T'da

+0

Penso che questa risposta sia la soluzione migliore e la data che stai analizzando nell'esempio è un po 'di ciliegina sulla torta. Grazie! – TaeKwonJoe

+0

Solo un commento a parte, la validazione è buona, tuttavia non chiamare il prototipo con la variabile parsed d. Ovviamente è necessario creare un'istanza in un oggetto Date. Altrimenti ti verranno dati errori stupidi, di "dateAdd, inesistenti". var d = Data(); d.dateAdd ('giorno', -1).dateAdd ('anno', 3); – MiloTheGreat

+0

Penso che questa non sia la soluzione corretta. Volevo che la persona dovesse essere maggiore di 18 anni in base alla data di nascita. ha tentato di sottrarre 18 anni dalla data corrente (28 marzo 2014), questa soluzione ha restituito il 28-feb-1996. Attraverso risposta verificata da http://www.timeanddate.com/date/dateadded.html?d1=28&m1=3&y1=2014&type=sub&ay=18&am=&aw=&ad= e 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 data ho ottenuto è stato 28-marzo-1996 Così ho pensa che manchi qualcosa. Il mese –

5

Una domanda simile è stato risposto qui:

How to add/subtract dates with javascript?

Simile cosa può essere fatto per mesi e anni.

Ad es.

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