?>
<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 nao 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);
    }

function parseDate(data)
{
// referenciando os objetos
	  		var matches = data.match(/^\b(\d{1,2})\D(\d{1,2})\D(\d{2}|\d{4})\b\b(?:\s+(\d{1,2})\D(\d{2})\D*((\d{2})?))?\b$/);
	  		// validando a data 
	  		if (!checkDate(matches[1],matches[2],matches[3]))
	  		{
	  			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/02/2010 23:30:61')) alert('Data válida');
else alert('Data inválida');
</script>