2011-09-28 5 views

risposta

13

Edit: soluzione esatta di seguito

Si potrebbe fare qualcosa di simile, ma con un algoritmo più preciso per la convalida del giorno:

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/

convalida Data ALG .: http://www.eee.hiflyers.co.uk/ProgPrac/DateValidation-algorithm.pdf

soluzione esatta: funzione che restituisce una data o nulla analizzata, a seconda delle vostre esigenze esattamente.

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/

In caso di necessità la funzione per restituire true/false e per un formato gg aaaa/mm/

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

In genere è meglio convertire le stringhe in numeri con [Unario plus operator] (https://developer.mozilla.org/en/JavaScript/Reference/Operators/Arithmetic_Operators#.2B_ (Unary_Plus)) piuttosto che 'parseInt' . I.e, 'd = + t [1]'. Evita problemi come quello in cui hai dimenticato di includere la radice nel calcolo del giorno (particolarmente problematico quando sappiamo che il giorno potrebbe avere zeri iniziali). – nnnnnn

+0

hmm .. buon punto :) –

6

prova -

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

C'è di più informazioni in questa domanda - Parse DateTime string in JavaScript (il codice nella mia risposta è fortemente influenzato dalla domanda legata)

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

EDIT

risposta Aggiornato, provare -

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

Questa funzione passa tutti i casi di test. Per quanto ne so, Adam Jurczyk ha pubblicato una risposta precisa prima di correggere la mia risposta originale sbagliata. Merita credito per questo.

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

+0

fallisce quando mese/giorno è swaped o dato valori più grandi, causa Data di costruzione per incrementi di default l'anno in questi casi. Maggiori informazioni qui: https://developer.mozilla.org/pl/Dokumentacja_j%C4%99zyka_JavaScript_1.5/Obiekty/Date –

+0

Questo è brutto in quanto divide manualmente una stringa di data (in base a presupposti specifici della cultura); per non parlare richiede una gestione delle eccezioni. – Noldorin

+0

@Noldor nella domanda si afferma che la data sarà nel formato 'gg/mm/aaaa'. Quindi ho pensato che fosse sicuro fare quella supposizione. – ipr101

0

è possibile utilizzare exp regolare per convalidare la data. provare in questo modo:

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

nota: questo funziona solo per i gg/mm/aaaa

per corrispondenza esatta per l'utilizzo requisito

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

L'espressione regolare non è corretta. La domanda afferma che giorno e mese devono essere entrambi di due cifre. Ma a parte questo, non funziona comunque perché non copre i giorni massimi al mese o mesi all'anno. – nnnnnn

+0

ho appena dato un esempio, che in questo modo può avvicinarsi non alla soluzione esatta – Pranav

+0

@ nnnnnn-è possibile personalizzare la regex in base alle proprie necessità. – Pranav

0

ho intenzione di rispondere a una domanda diversa, come Misha Moroshko ha già avuto una buona risposta: usa HTML5.data che è, sul presupposto che le stringhe in questione nascono come input dell'utente attraverso un browser Web, propongo che le voci essere ricevuti come

<input type = "date" ... 

riconosco che non tutti i browser che potrebbero essere in uso interpreterà" "in un modo che applica rigorosamente validità. È la cosa giusta da fare, però, sicuramente migliorerà col passare del tempo, e potrebbe essere abbastanza buono in un particolare contesto, anche adesso semplicemente per eliminare la necessità di convalidare la stringa data dopo il fatto.

0

Personalmente, penso che la soluzione migliore sarebbe quella di modificare l'interfaccia utente per utilizzare i menu a discesa per il mese e le selezioni del giorno.

Cercare di capire se 1/2/2001 è il 2 gennaio o il 1 ° febbraio in base esclusivamente a tale stringa di input è impossibile.

0

recente scoperta: È possibile utilizzare date.js lib, si aggiunge la funzione Date.parseExact così si può solo fare Date.parseExact(dateString,"dd/MM/yyyy"). Fallisce quando il mese è 00, ma è ancora utile.

0

per il formato/mm/aaaa gg solo

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