1) Se possibile, evitare di usarla e utilizzare piuttosto la libreria java.time.*
2) Se siamo costretti a usarla, evitiamo di utilizzare i membri deprecati
3) Un'istanza Date rappresenta un istante nel tempo, non una data; cio' significa che:
- Non ha un fuso orario
- Non ha un formato
- Non ha un sistema di calendario
1) Il suo nome e' fuorviante, come ho gia' detto essa non rappresenta una data ma un istante nel tempo. Il suo equivalemte in java.time e' Instant
2) Non e' un tipo "final" e cio' incoraggia gli scarsi usi dell'eredita'
3) Utilizza implicitamente il fuso orario locale del sistema
4) La numerazione dei mesi e' copiata da C ed e' di tipo 0-based
5) La sua numerazione dell'anno e' anch'essa copiata da C ed e' di tipo 1900-based
6) I suoi metodi hanno un nome poco chiaro, getDate() restituisce il giorno del mese e getDay() restituisce il giorno della settimana
7) Non e' certo che supporti o meno i secondi bisestili (leap seconds)
8) E' indulgente per nessuna ragione ovvia (ad esempio, una data puo' essere specificata come 32 Gennaio ed e' interpretata come 1 Febbraio, quanto e' utile?)
Cos'e' un "istante nel tempo"?
Quando parliamo di un "istante", facciamo riferimento a un modo per identificare quando e' successo qualcosa, e' indipendente dal fuso orario e dal sistema di calendario, quindi piu' persone che usano le loro rappresentazioni "locali" dell'ora potrebbero parlarne in diversi modi.
Non importa dunque quale sia il fuso orario del sistema quando costruiamo un Date, esso non dipende affatto dal fuso orario locale, ma se usiamo Date.toString(), il valore viene comunque visualizzato nel fuso orario predefinito corrente e l'eventuale modifica del fuso orario predefinito non modifica affatto il valore della Data.
Come facciamo a convertire una data in un fuso orario diverso?
Non possiamo, perche' un Date non ha un fuso orario, e' un istante nel tempo, non lasciamoci ingannare dall'output di toString(), questo mostra l'istante nel fuso orario predefinito, non fa parte del valore.
Come faccio a convertire una data in un formato diverso?
Non possiamo, perche' un Date non ha un formato, non lasciamoci ingannare neanche qui dall'output di toString(), questo utilizza sempre lo stesso formato.
Per formattare una data in un modo particolare, usiamo quindi un DateFormat adatto (potenzialmente un SimpleDateFormat), ricordando di impostare il fuso orario sul fuso appropriato per il nostro uso.