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

Este es el código Javascript que estoy utilizando para calcular una fecha de caducidad dada la fecha ingresada por el usuario. Actualmente, la fecha de caducidad es original date minus one day and original year minus X.Restar días/meses/años desde un objeto Fecha

Los problemas con este código, en primer lugar, no tiene en cuenta las fechas no válidas. Por ejemplo, si la fecha suministrada por el usuario es '1/10/2010', la fecha de vencimiento será '0/10/2013' (suponiendo que la fecha de vencimiento sea de +3 años).

que podía hacer algo como: surgen

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

Pero más problemas ... En primer lugar, el código se hace un poco complicado. En segundo lugar, este control debería hacerse en el día. y luego el mes. ¿Hay una manera más limpia y simple?

Además, hay una cierta circunstancia que implicaría la necesidad de calcular la fecha de caducidad hasta el 'fin de mes' para esa fecha. Por ejemplo:

Expiry date is: +3 years 

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

que estaba esperando la Date object apoyaría estos cálculos, pero de acuerdo a https://developer.mozilla.org/en/JavaScript/Reference/global_objects/date, no parece ...

+0

momentjs.com hace más fácil de esta manera: http://momentjs.com/ – bernie2436

Respuesta

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

utilizando el número de segundos pasados ​​1970 está muy bien para esto: -) oh, tienes más reglas. bien después de que usted todavía tiene que comprobar para aquellos casos ...

+1

Lo sentimos, no estoy del todo seguro de cómo funciona ... ¿Qué representa cada número? ¿Cómo calculo +4 años encima de una fecha dada usando eso? – dave

11

Fácil manera de ver si una fecha inputed es una fecha válida:

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

Luego, aquí hay una función de agregar fecha que uso regularmente. Se extiende el objeto Date, por lo que es fácil de usar:

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

Entonces sólo tiene que utilizar:

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

T'da

+0

Creo que esta respuesta es la mejor solución y la fecha en que está analizando en el ejemplo es un poco guinda del pastel. ¡Gracias! – TaeKwonJoe

+0

Solo un comentario lateral, la validación es buena, sin embargo, no llame al prototipo con la variable analizada d. Obviamente necesitas instanciar esto en un objeto Date. De lo contrario, obtendrá errores tontos, de "dateAdd, does not exists". var d = Fecha(); d.dateAdd ('día', -1).dateAdd ('año', 3); – MiloTheGreat

+0

Creo que esta no es la solución correcta. Yo quería persona debe ser mayor de 18 años en función de la fecha de nacimiento. intentó restar 18 años de la fecha actual (28 de marzo de 2014), esta solución regresó el 28 de febrero de 1996. cruzo respuesta verificada del http://www.timeanddate.com/date/dateadded.html?d1=28&m1=3&y1=2014&type=sub&ay=18&am=&aw=&ad= y 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 fecha que me dieron fue 28-marzo-1996 Por lo tanto, piensa que falta algo. –

5

Una pregunta similar ha sido respondida aquí:

How to add/subtract dates with javascript?

Algo similar se puede hacer durante meses y años.

Por ej.

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