Usando Javascript in maniera intensiva è facile incappare in alcune difficoltà che somigliano un po' ai verbi irregolari della lingua inglese. Mi riferisco a particolari aspetti o funzionalità che sono fatte in un determinato modo e vanno prese così come sono, ricordandosi che essi sono "casi speciali".
Un esempio è l'oggetto
Date. Per usare le date in Javascript infatti esiste questo oggetto predefinito di grande utilità.
Per riferirsi alla data odierna per esempio è sufficiente istanziare un nuovo oggetto Date:
var today = new Date();
Per mostrarlo a video possiamo semplicemente usare la variabile che invocherà il metodo toString() in automatico:
var today = new Date();
alert(today);
Anche per quanto riguarda le
operazioni tra date, l'oggetto predefinito è molto potente e permette di utilizzare gli operatori == , < , > per poter confrontare 2 date distinte:
var today = new Date();
var a_chosen_day = new Date("October 13, 1975 11:13:00");
if(today > a_chosen_day) alert("Oggi e' un giorno successivo alla data scelta");
else alert("Oggi e' un giorno precedente (oppure lo stesso giorno) alla data scelta");
I problemi iniziano quando vogliamo istanziare un nuovo giorno senza passare dalla stringa come nell'esempio. Infatti questa ha il difetto di richiedere la data in lingua inglese ed in un certo formato, mentre l'utilizzo più tipico è quello di usare giorni, mesi e anni per rappresentare una data.
L'oggetto Date contiene 4 costruttori, ognuno utile per determinati scopo, ma l'ultimo sicuramente è quello più generico:
new Date() // imposta la data e l'ora ad oggi, al momento in cui viene invocato
new Date(milliseconds) // millisecondi trascorsi dal 1 gennaio 1970
new Date(dateString) // la stringa deve essere in formato "October 13, 1975 11:13:00" (Month day, Year Hour:Minutes:Seconds)
new Date(year, month, day, hours, minutes, seconds, milliseconds) // tutti i parametri sono opzionali quindi è lecito usare "new Date(1975,10,13)" senza specificare l'ora
L'ultimo costruttore ha però un difetto: la numerazione dei mesi! Infatti mentre gli anni vengono intepretati correttamente (se inserisco 1975, l'anno rappresentato è il 1975) i mesi sono rappresentati da 0 a 11.
Questo comporta che il risultato del seguente codice:
var a_chosen_day = new Date("October 13, 1975 00:00:00");
var another_day = new Date(1975,10,13);
if(another_day == a_chosen_day) alert("Le due date coincidono");
else alert("Le due date sono differenti!");
Risulta questo:
"Le due date sono differenti!"
Per ottenere la stessa data è necessario cambiare il mese di another_day:
var another_day = new Date(1975,9,13);
E' molto importante ricordarsi di questo comportamento particolare, dato che i giorni invece non seguono lo stesso andamento e sono rappresentati con un numero da 1 a 31.