<script>
     /**
     * Valida uma data passada
     * @param string dia
     * @param string mes
     * @param string ano
     * @return Bool TRUE em caso de data válida, do contrário FALSE
     */
     function checkDate(dia,mes,ano){
     	var dateRegExp =/^(19|20)\d\d-(0?[1-9]|1[012])-(0?[1-9]|[12][0-9]|3[01])$/;
        if (!dateRegExp.test(ano+"-"+mes+"-"+dia)) return false; // formato inválido
        if (dia == 31 && ( /^0?[469]$/.test(mes) || mes == 11) ) {
            return false; // dia 31 de um mes de 30 dias
        }else if (dia >= 30 && mes == 2) {
            return false; // mais de 29 dias em fevereiro
        }else if (mes == 2 && dia == 29 && !(ano % 4 == 0 && (ano % 100 != 0 || ano % 400 == 0))) {
            return false; // dia 29 de fevereiro de um ano não bissexto
        }else {
            return true; // Data válida
        }
    }


     /**
     * Valida uma hora passada
     * @param int h Hora
     * @param int m Minuto
     * @param int s Segundo
     * @return Bool TRUE em caso de horário válido, do contrário FALSE
     */    
    function checkTime(h,m,s){
    	if(!s) s='00';
		var horarioRegExp = /^(0?\d|1\d|2[0-3]):[0-5]?\d:[0-5]?\d$/;
        return horarioRegExp.test(h+":"+m+":"+s);
    }

     /**
     * Valida uma string de data passada
     * @param String data Uma string representando uma data
     * @param String formato O formato em que a data passada se encontra [default = (d/m/Y) + H:i:s 
     * @return Bool TRUE em caso de data/hora válida, do contrário FALSE
     */ 
function parseDate(data,formato)
{
	if(!formato) 
	{	
		
		var mes = 2;
		var dia = 1;
		var ano = 3;
	}
	else
	{
		// Será usado o formato passado no segundo argumento
		formato = formato.toLowerCase().replace(/[^dmy]/g,'');
		var dia = formato.indexOf('d')+1;
		var mes= formato.indexOf('m')+1;
		var ano= formato.indexOf('y')+1;	
	}


	var matches = data.match(/^\b(\d+)\D(\d+)\D(\d+)\b\b(?:\s+(\d{1,2})\D(\d{2})\D*((\d{2})?))?\b$/);	


	  		// validando a data 
	  		if (!checkDate(matches[dia],matches[mes],matches[ano]))
	  		{
	  			return false;
	  		}
	  		else if(matches.length>=5)
	  		{
	  		 return checkTime(matches[4],matches[5],(matches[6]?matches[6]:false));
	  		}
	  		else
	  		{
	  		  return true;
	  		}

}

// Exemplo de uso
  if(parseDate('28/2010/02 23:30:59','d/Y/m H:i:s')) alert('Data válida');
else alert('Data inválida');
</script>