2013-12-11 2 views
7

Se provo ad analizzare un appuntamento con la seguente sintassi:incoerente determinazione delle date valide usando Date.parse

var date1 = new Date(Date.parse('2013' + '/' + '02' + '/' + '29')); 

restituirà 1 marzo 2013.

var date1 = new Date(Date.parse('2013' + '/' + '02' + '/' + '30')); 

tornerà 2 marzo 2013 . Ma se faccio

var date1 = new Date(Date.parse('2013' + '/' + '02' + '/' + '33')); 

tornerà Invalid Date.

Il mio punto è, perché non tutte queste date restituiscono ?

+1

@Qantas 94 Pesante: grazie per la modifica. ;-) –

+1

Va tutto bene - non c'è bisogno di ringraziarmi;) –

risposta

3

L'unico formato che è necessario analizzare Date.parse è una semplificazione di ISO 8601. È possibile leggere ulteriori dettagli sul formato esatto nello ecma specification.

Qualsiasi altro formato che Date.parse riconosce come data specifica dell'implementazione. Il formato che hai citato non fa parte dello standard sopra riportato, quindi ogni implementazione può dare qualsiasi risultato per quello che desidera.

Accade così che quando passi in un giorno del mese superiore a 31, il parser considererà una stringa non valida, quindi restituirà NaN. Controllare per vedere se la data è valida è molto più difficile a causa di vari problemi con le irregolarità del mese, gli anni bisestili, i secondi mancanti, i fusi orari, ecc. Quindi non è garantito l'inserimento di tutta questa logica nel parser. Con la data apparentemente valida, viene convertita in un timestamp e restituita da Date.parse ea quel punto il nuovo Date() ha qualcosa su cui lavorare.

La conclusione è che l'utilizzo di formati non standard con Date.parse non è affidabile e, se possibile, dovrebbe essere evitato.

1

Poiché i valori per il giorno può contenere fino al numero 31.

+2

Non credo che questo * davvero * risponda alla domanda.Mi sarei aspettato che '2013/02/30' fosse una data non valida – CodingIntrigue

+0

quindi, come posso verificare la data senza" Clausing "anno bisestile? –

3

disegno terribile, forse? (o piuttosto l'implementazione dubbia degli standard)

C'è sempre problemi quando si lavora con la data JavaScript oggetto esp cross browser (i ragazzi del browser tendono ad implementare gli standard a modo loro). Posso tenerti occupato per un po 'con storie/problemi dell'orrore che ho incontrato nel corso degli anni - ecco perché abbiamo delle belle librerie come DateJs.

Ad esempio questo (il vostro esempio) non è nemmeno il comportamento per tutti i browser, testato in IE9 e l'ultimo frammento di rendimenti 5 Mar 2013 (come previsto dagli altri due frammenti precedenti), in Chrome l'ultimo frammento di restituisce una data non valida.

Ma sì, sarei d'accordo sul fatto che avrebbe avuto più senso se tutte e tre restituissero date non valide.

Aggiornamento (2015/1/8)

Sembra DateJs non è più davvero attivamente mantenuta? Voi ragazzi potreste voler esaminare l'uso di MomentJs in alternativa.

+0

Wow..Nice indizio. Non sapevo nemmeno che ci fosse la libreria DateJs –