Java ha finalmente un modo intuitivo e affidabile per lavorare con date e orari. I principi di data e ora sono fondamentali in molte applicazioni. Vari elementi come le date di nascita, le date di noleggio, gli orari degli eventi e gli orari di apertura dei negozi si basano tutti su date e orari, ma Java SE non ha fornito un modo conveniente per lavorarci. A partire da Java SE 8 , era disponibile una serie di pacchetti java.time , che forniscono un'API ben strutturata per lavorare con date e orari.
Ecco un piccolo elenco di problemi esistenti nella sua implementazione:
Sfondo
Quando Java uscì per la prima volta, nella versione 1.0 , l'unica classe per lavorare con date e orari era java.util.Date . La prima cosa che gli sviluppatori hanno notato è che non rappresenta una “data”. In effetti, rappresenta un momento nel tempo, preciso al millisecondo, misurato a partire dalla data 1 gennaio 1970. Tuttavia, basandosi sul fatto che il metodo toString() di Date visualizza la data e l'ora nel fuso orario specificato nelle impostazioni Java della macchina , alcuni sviluppatori hanno erroneamente concluso che Date può funzionare con i fusi orari. Correggere questa classe si è rivelato così difficile (o così pigro) che nella versione 1.1 abbiamo dovuto aggiungere una nuova classe: java.util.Calendar . Sfortunatamente, la classe Calendar si è rivelata non molto migliore di Date .- Variabile. Classi come data e ora dovrebbero essere immutabili.
- Compensazioni. Gli anni nella data iniziano dal 1900, i mesi in entrambe le classi iniziano da zero.
- Nomi. La data non è effettivamente una "data" e il calendario non è un calendario.
- Formattazione. La formattazione funziona solo con la data, non con il calendario e non è thread-safe.
Revisione
La nuova API java.time contiene 5 pacchetti:- java.time - il pacchetto base contenente oggetti per memorizzare valori
- java.time.chrono: fornisce l'accesso a diversi calendari
- java.time.format: formattazione e riconoscimento di data e ora
- java.time.temporal: librerie di basso livello e funzionalità avanzate
- java.time.zone - classi per lavorare con i fusi orari
Date
La classe LocalDate è una delle più importanti nella nuova API . Contiene un valore immutabile che rappresenta una data. Non è possibile impostare l'ora o il fuso orario. Il nome "locale" potrebbe esserti familiare grazie a Joda-Time e deriva originariamente dallo standard ISO-8601 . Significa proprio l'assenza di un fuso orario. Essenzialmente, LocalDate è una descrizione di una data, ad esempio "5 aprile 2014". L'ora effettiva di questa data varierà a seconda del fuso orario. Ad esempio, in Australia questa data sarà 10 ore prima rispetto a Londra e 18 ore prima rispetto a San Francisco. La classe LocalDate ha tutti i metodi comunemente necessari:LocalDate date = LocalDate.of(2014, Month.JUNE, 10); int year = date.getYear(); // 2014 Month month = date.getMonth(); // Июнь int dom = date.getDayOfMonth(); // 10 DayOfWeek dow = date.getDayOfWeek(); // Вторник int len = date.lengthOfMonth(); // 30 (дней в Июне) boolean leap = date.isLeapYear(); // false (не високосный год)
nel nostro esempio, vediamo una data creata utilizzando un metodo factory (tutti i costruttori sono privati). Successivamente chiediamo all'oggetto alcuni dati. Tieni presente che
le enumerazioni Month e
DayOfWeek sono progettate per rendere il codice più leggibile e affidabile. Nell'esempio seguente vedremo come modificare la data. Poiché la classe è immutabile, il risultato saranno nuovi oggetti, ma quello originale rimarrà com'era.
LocalDate date = LocalDate.of(2014, Month.JUNE, 10); date = date.withYear(2015); // 2015-06-10 date = date.plusMonths(2); // 2015-08-10 date = date.minusDays(1); // 2015-08-09
Si tratta di modifiche relativamente semplici, ma spesso è necessario apportare modifiche alla data più complesse. Esiste un meccanismo speciale per questo nell'API
java.time - TemporalAdjuster . Il suo scopo è fornire uno strumento integrato che consenta di manipolare le date, ad esempio ottenendo un oggetto corrispondente all'ultimo giorno del mese. Alcuni di essi sono inclusi nell'API
, ma puoi aggiungerne di tuoi. Usare i modificatori è molto semplice, ma richiede importazioni statiche:
import static java.time.DayOfWeek.* import static java.time.temporal.TemporalAdjusters.* LocalDate date = LocalDate.of(2014, Month.JUNE, 10); date = date.with(lastDayOfMonth()); date = date.with(nextOrSame(WEDNESDAY));
l'uso dei modificatori semplifica notevolmente il codice. Nessuno vuole vedere molta manipolazione manuale della data. Se qualche tipo di manipolazione della data si verifica più volte nel tuo progetto, scrivi il tuo modificatore e il tuo team potrà utilizzarlo come componente già scritto e testato.
GO TO FULL VERSION