Js: Método Rápido de validación de Fechas

El método más rápido de validación de una fecha, en este ejemplo la fecha es del tipo YYYY-MM-DD peor también admite YYYY-m-d, esta basado en que la expresión ingresada pase por una expresión regular, para luego una vez cerciorado que la fecha esta escrita de una forma definida, extraer sus componentes y crear un objecto Date, la magia de esto, es que el objeto Date permite ingresar "fechas no validas" como el mes 13 14, pero este piensa que quieres simplemente seguir avanzando en el calendario, por lo que si ingresamos el día 13 del mes 14, de 2014, Javascript va a crear un objeto Date pero con fecha día 13 del mes 2 del año 2015.

 

Luego el código queda de la siguiente manera.

function testDate( sDate ){

  /*
   * verifica que la fecha pesea el formato correcto
   * verifica que los primeros 4 caracteres deben ser números seguidos de un "-""
   * luego deben haver entre 1 y 2 caracteres numericos, seguidos por un "-"
   * finalmente debe terminar entre 1 y 2 caracteres también numericos
   */
  var regexDate = /[0-9]{4}-[0-9]{1,2}-[0-9]{1,2}$/;

  if( !regexDate.test(sDate) ){
      return false;
  }

  // Divide the sDate sting in to an array using "-" divitions
  var aDate = sDate.split("-");

  // first check the length pf the array
  if( aDate.length !== 3 ){
      return false;
  }

  // Parse the number to compare
  aDate[0] = parseInt(aDate[0]);
  aDate[1] = parseInt(aDate[1]);
  aDate[2] = parseInt(aDate[2]);

  // Detetect if the date was weel write
  var oDate = new Date(aDate[0],(aDate[1]-1),aDate[2]);

  // Detect if the year is correct
  if( oDate.getFullYear() != aDate[0] ){
      return false;
  }
  // Detect if the month is correct
  if( (oDate.getMonth()+1) != aDate[1] ){
      return false;
  }

  // Detect if the day is correct
  if( oDate.getDate() != aDate[2] ){
      return false;
  }

  // La fecha es válida =]
  return true;
}

Para probar el código realice una serie de test que se pueden ver acontinuación

test("Date test", function(){  
    equal( false,testDate("2014-02"), "Detecta fechas incompletas o mal escritas" );
    equal( false,testDate("2014-02-30"),"Detecta fechas imposibles" );
    equal( false,testDate("2014-12-32"),"Detecta fechas imposibles" );
    equal( false,testDate("2014-13-30"),"Detecta fechas imposibles" );
    equal( false,testDate("2014-12-30sdasd"),"Detecta fechas mal terminadas" );
    equal( false,testDate("2014-12-30-sdasd"),"Detecta fechas mal terminadas 2" );
    equal( false,testDate("2014-2-29"),"Detecta mal uso del 29 de febrero (año no viciesto)" );
    equal( false,testDate("asdf-qw-tr"),"Detecta fecha no numérica" );
    equal( true,testDate("2014-2-3"),"Admite fechas cortas en mes y día" );
    equal( true,testDate("2014-2-10"),"Admite fechas cortas en mes" );
    equal( true,testDate("2014-12-3"),"Admite fechas cortas en día" );
} )

Finalmente la imagen que muestra que pasé todos los test =]

[caption id="attachment_658" align="aligncenter" width="574"]Resultado de los test Resultado de los test[/caption]

Puede ves el código fuente tanto de este código como de los test en el archivo "dateValidator.html" en el siguiente repositorio de github https://github.com/gaviles/JsFunctions