Ciao, quoto br1 per il discorso del 29 febbraio nell'anno non bisestile ma, a parte quello, io parlerei comunque di vari errori concettuali e non. Ho l'impressione che il tuo script faccia acqua un po' da tutte le parti.
Mentre, riguardo questo:
Da prendere con le pinze ciò che sto dicendo perché non ho idea del perché accada ma, testando (con Vista) su FF, CH e IE9, posso confermare che effettivamente, su FF e CH, sembrerebbe ci sia un qualche problema nella gestione delle date antecedenti il 1978 (a seconda anche del mese specificato), per cui viene restituito lo scarto di un giorno.Non mi risulta che la terza data restituita, nonostante l'errore concettuale, sia sbagliata![]()
Questo script:
mi restituisce:codice:var data = new Date(1963, 8, 28); console.log(data); console.log(data.toLocaleDateString());
- con FF
Date 1963-09-27T22:00:00.000Z
27/9/1963
- con CH
Sat Sep 28 1963 00:00:00 GMT+0200 (ora legale Europa occidentale)
27/9/1963
- con IE9
Registro: Sat Sep 28 00:00:00 UTC+0200 1963
Registro: sabato 28 settembre 1963
Da notare che su CH l'oggetto Date riporta correttamente il giorno mentre avviene lo scarto solo con toLocaleDateString().
Potrei pensare ad una qualche convenzione (diversa tra i vari browser) usata sull'impostazione dei fusi orari... ma non ho cercato molto a riguardo e non saprei cosa consigliare in questo caso, se non impostare anche un'ora "fittizia" sull'oggetto Date. Ripeto -da prendere con le pinze-.
Una cosa tipo:
In tal caso i valori restituiti sono corretti in tutti i browser su cui ho testato.codice:new Date(1963, 8, 28, 12);
A prescindere da questi problemi, ti chiedo:
- Che senso ha impostare un oggetto Date quando poi nella funzione fai solo il confronto con l'anno?
In questo caso non avrebbe più senso usare una semplice variabile in cui riportare solo l'anno, e quindi confrontare questo valore con l'anno della data corrente?
A dirla tutta, se vuoi ottenere l'età reale, sarebbe opportuno fare la differenza tra la data corrente e la data, per intero, di nascita; non solo tra il valore degli anni, perché questo potrebbe restituire uno scarto di un intero anno, sfalsando quindi il risultato... Oggi è 27/01/2016, supponendo che io sia nato il 31/12/2015, dovrei avere meno di un mese, mentre la tua funzione mi restituisce "1 anni"
- Che senso ha usare un oggetto Date temporaneo, facendo quel passaggio intermedio (evidenziato da br1), se poi nella riga dopo vai semplicemente a ri-passare i tre dati in un ulteriore oggetto Date, decrementando giusto il mese (che peraltro è un procedimento che può restituire risultati inattesi, come hai constatato nel secondo caso di cui br1 ha chiarito il problema)?
Non puoi semplicemente impostare l'oggetto Date decrementando direttamente di 1 il valore del mese, senza il passaggio intermedio?
- Altro piccolo "errore" di brutta programmazione è la dichiarazione multipla della variabile tmp. L'interprete JavaScript sorvola su questo ma è chiaro che è brutto a vedersi e che non ti serve a nulla dichiarare la stessa variabile più volte all'interno di uno stesso scope. Anche se assume dei valori differenti, andrebbe dichiarata una sola volta, magari all'inizio del codice.
- Ancora, l'uso di valori numerici preceduti dallo 0, potrebbe comportare una falsa interpretazione in JavaScript che li converte automaticamente (o cerca di farlo) in valori ottali.
Questa riga, presa così com'è:
su FF genera il seguente errore:codice:var tmp = new Date(1963, 08, 28);
Meglio, in questo caso, scrivere il numero senza zeri iniziali.codice:SyntaxError: 08 is not a legal ECMA-262 octal constant
Buon per teLavorando in JS per creare una data uso questa forma, che sinora ha sempre funzionato![]()



Rispondi quotando