2011-09-28 21 views

Respuesta

13

Editar: solución exacta a continuación

Podría hacer algo como esto, pero con un algoritmo más preciso para la validación del día:

function testDate(str) { 
    var t = str.match(/^(\d{2})\/(\d{2})\/(\d{4})$/); 
    if(t === null) 
    return false; 
    var d = +t[1], m = +t[2], y = +t[3]; 

    // Below should be a more acurate algorithm 
    if(m >= 1 && m <= 12 && d >= 1 && d <= 31) { 
    return true; 
    } 

    return false; 
} 

http://jsfiddle.net/aMWtj/

alg validación Fecha .: http://www.eee.hiflyers.co.uk/ProgPrac/DateValidation-algorithm.pdf

solución exacta: función que devuelve una fecha o nula analizado, dependiendo de sus necesidades exactamente.

function parseDate(str) { 
    var t = str.match(/^(\d{2})\/(\d{2})\/(\d{4})$/); 
    if(t !== null){ 
    var d = +t[1], m = +t[2], y = +t[3]; 
    var date = new Date(y, m - 1, d); 
    if(date.getFullYear() === y && date.getMonth() === m - 1) { 
     return date; 
    } 
    } 

    return null; 
} 

http://jsfiddle.net/aMWtj/2/

En caso de que necesite la función para devolver verdadero/falso y para un formato aaaa/mm/dd

function IsValidDate(pText) { 
    var isValid = false ; 
    var t = pText.match(/^(\d{4})\/(\d{2})\/(\d{2})$/); 

    if (t !== null) { 
     var y = +t[1], m = +t[2], d = +t[3]; 
     var date = new Date(y, m - 1, d); 

     isValid = (date.getFullYear() === y && date.getMonth() === m - 1) ; 
    } 

    return isValid ; 
} 
+0

En general, es mejor que convierta cadenas en números con el [operador Unary plus] (https://developer.mozilla.org/en/JavaScript/Reference/Operators/Arithmetic_Operators#.2B_ (Unary_Plus)) en lugar de 'parseInt' . Es decir, 'd = + t [1]'. Evita problemas como que olvidó incluir la raíz en el cálculo del día (particularmente problemático cuando sabemos que el día puede tener ceros a la izquierda). – nnnnnn

+0

hmm ... buen punto :) –

6

intento -

var strDate = '12/03/2011'; 
    var dateParts = strDate.split("/"); 
    var date = new Date(dateParts[2], (dateParts[1] - 1) ,dateParts[0]); 

Hay más información en esta pregunta - Parse DateTime string in JavaScript (el código en mi respuesta está fuertemente influenciado por la pregunta vinculada)

Demo - http://jsfiddle.net/xW2p8/

EDITAR

respuesta actualizado, intenta -

function isValidDate(strDate) { 
    if (strDate.length != 10) return false; 
    var dateParts = strDate.split("/"); 
    var date = new Date(dateParts[2], (dateParts[1] - 1), dateParts[0]); 
    if (date.getDate() == dateParts[0] && date.getMonth() == (dateParts[1] - 1) && date.getFullYear() == dateParts[2]) { 
     return true; 
    } 
    else return false; 
} 

Esta función pasa todos los casos de prueba. Hasta donde sé, Adam Jurczyk había publicado una respuesta precisa mucho antes de que corrigiera mi respuesta incorrecta original. Él merece crédito por esto.

Demo - http://jsfiddle.net/2r6eX/1/

+0

fracasa cuando mes/día se swaped o recibir valores más grandes, causa Fecha constructor para incrementos predeterminados años en este tipo de casos. Más aquí: https://developer.mozilla.org/pl/Dokumentacja_j%C4%99zyka_JavaScript_1.5/Obiekty/Date –

+0

Esto es feo porque divide manualmente una cadena de fecha (según las suposiciones específicas de cada cultura); sin mencionar que requiere manejo de excepciones. – Noldorin

+0

@Noldorin la pregunta establece que la fecha estará en formato 'dd/mm/aaaa'. Así que pensé que era seguro hacer esa suposición. – ipr101

0

puede utilizar exp regulares para validar la fecha. tratan de esta manera:

re = /^\d{1,2}\/\d{1,2}\/\d{4}$/; 
if(form.mydate.value != '' && !form.mydate.value.match(re)) 
    //do something here 

nota: esto sólo funcionará para dd/mm/aaaa

para la coincidencia exacta de su utilización requisito

re = /^\d{2}\/\d{2}\/\d{4}$/; 
+0

Esa expresión regular es incorrecta. La pregunta establece que el día y el mes deben tener dos dígitos. Pero aparte de eso, no funciona de todos modos porque no cubre el máximo de días por mes o meses por año. – nnnnnn

+0

Acabo de dar un ejemplo, que de esta manera él puede acercarse no a la solución exacta – Pranav

+0

@ nnnnnn-puede personalizar la expresión regular de acuerdo a su necesidad. – Pranav

0

voy a responder a una pregunta diferente, como se Misha Moroshko ya ha recibido una buena respuesta: use HTML5.fecha, es decir, en el supuesto de que las cadenas en cuestión surgen como entradas del usuario a través de un navegador Web, propongo que se recibirán las entradas como

<input type = "date" ... 

Reconozco que no todos los navegadores que puedan estar en uso interpretará" "de una manera que refuerza rigurosamente la validez. Sin embargo, es lo correcto, sin duda, mejorará con el tiempo, y podría ser lo suficientemente bueno en un contexto particular incluso ahora simplemente para eliminar la necesidad de validar la cadena de fecha después del hecho.

0

Personalmente, creo que la mejor solución sería modificar la interfaz de usuario para usar las listas desplegables para las selecciones de mes y posiblemente del día.

Tratar de averiguar si 1/2/2001 es el 2 de enero o el 1 de febrero basado únicamente en esa cadena de entrada es imposible.

0

descubrimiento reciente: Puede utilizar date.js lib, que añade la función Date.parseExact por lo que sólo puede hacer Date.parseExact(dateString,"dd/MM/yyyy"). Falla cuando el mes es 00, pero sigue siendo útil.

0

para el formato/mm/aaaa dd única

^(0?[1-9]|[12][0-9]|3[01])[\/](0?[1-9]|1[012])[\/]\d{4}$ 
Cuestiones relacionadas