JavaRush /Java Blog /Random-IT /Una libreria intuitiva e robusta per lavorare con orari e...
theGrass
Livello 24
Саратов

Una libreria intuitiva e robusta per lavorare con orari e date è finalmente disponibile in Java (Parte 2).

Pubblicato nel gruppo Random-IT
Momenti della giornata
    Quindi andiamo avanti. L'entità successiva dopo la data è l'ora del giorno, rappresentata dalla classe LocalTime . Un classico esempio è rappresentare l'orario di apertura di un negozio, diciamo dalle 7:00 alle 23:00. I negozi aprono in questo orario in tutto il Paese, ma gli orari effettivi varieranno a seconda del fuso orario.     LocalTime è una classe di valori che archivia solo l'ora, senza una data o un fuso orario associati. Quando si aggiunge o si sottrae un periodo di tempo, questo verrà interrotto a mezzanotte. Cioè, 20:00 più 6 ore fanno 2:00. L'uso di LocalTime è simile a LocalDate : LocalTime time = LocalTime.of(20, 30); int hour = date.getHour(); // 20 int minute = date.getMinute(); // 30 time = time.withSecond(6); // 20:30:06 time = time.plusMinutes(3); // 20:33:06     i modificatori possono funzionare con LocalTime , ma le operazioni temporali in genere non sono così complesse da richiedere i modificatori.
Combinazione di data e ora
    La prossima classe che esamineremo è LocalDateTime . Questa classe di valori è una combinazione di LocalDate e LocalTime . Rappresenta sia la data che l'ora, senza fuso orario.      LocalDateTime può essere creato direttamente o combinando data e ora: LocalDateTime dt1 = LocalDateTime.of(2014, Month.JUNE, 10, 20, 30); LocalDateTime dt2 = LocalDateTime.of(date, time); LocalDateTime dt3 = date.atTime(20, 30); LocalDateTime dt4 = date.atTime(time);     la terza e la quarta opzione utilizzano il metodo atTime() , che fornisce un modo flessibile per combinare data e ora. La maggior parte delle classi di sistema di data e ora dispongono di metodi "at" che possono essere utilizzati quando si combina l'oggetto con un altro per crearne uno più complesso. Gli altri metodi della classe LocalDateTime sono simili a quelli di LocalDate e LocalTime . Modelli di denominazione di metodi simili rendono l'API più semplice da apprendere . Questa tabella elenca tutti i prefissi dei metodi coinvolti: Una libreria intuitiva e robusta per lavorare con orari e date è finalmente disponibile in Java (Parte 2).  -1
Immediato
    Quando abbiamo a che fare con date e ore, di solito lavoriamo con anni, mesi, giorni, ore, minuti, secondi. Tuttavia, questo è solo un modello di tempo che può essere definito “umano”. Il secondo modello comunemente utilizzato è il tempo “macchina” o “continuo”. In questo modello, un punto sull'asse del tempo è rappresentato da un numero grande. Questo approccio semplifica gli algoritmi di calcolo e viene utilizzato per memorizzare il tempo nel sistema operativo Unix , dove il tempo è rappresentato dal numero di secondi trascorsi dal 1 gennaio 1970. Allo stesso modo, in Java , il tempo viene memorizzato come il numero di millisecondi trascorsi dal 1 gennaio 1970. L'approccio della macchina ai calcoli temporali nell'API java.time è fornito dalla classe Valore istantaneo . Fornisce la possibilità di rappresentare un punto su un asse temporale senza tutte le informazioni di accompagnamento, come il fuso orario. Infatti questa classe contiene il numero di nanosecondi trascorsi dalla mezzanotte del 1 gennaio 1970. Instant start = Instant.now(); // произведем вычисления Instant end = Instant.now(); assert end.isAfter(start); //машина времени не сработала     In genere la classe Instant viene utilizzata per archiviare e confrontare punti nel tempo in cui è necessario archiviare il momento in cui si è verificato un evento ma non ti interessa il fuso orario in cui è accaduto. Nella maggior parte dei casi, è più interessante ciò che non possiamo fare con la classe Instant rispetto a ciò che possiamo fare con essa. Ad esempio, le seguenti righe di codice genereranno eccezioni: instant.get(ChronoField.MONTH_OF_YEAR); instant.plus(6, ChronoUnit.YEARS);     Le eccezioni si verificano perché l' oggetto istantaneo memorizza solo il numero di nanosecondi e non fornisce la possibilità di lavorare con unità di tempo più utili agli esseri umani. Per utilizzare altre unità di misura è necessario specificare almeno un fuso orario.
Fusi orari
    Il principio dei fusi orari è stato sviluppato in Inghilterra quando l’invenzione delle ferrovie e il miglioramento di altri mezzi di comunicazione hanno permesso alle persone di percorrere distanze sufficienti affinché le differenze nell’ora solare fossero evidenti. Fino a quel momento, ogni villaggio e città viveva secondo il proprio tempo, che molto spesso veniva misurato dalla meridiana. Questa immagine mostra un esempio delle difficoltà che ciò ha comportato: le lancette rosse dell'orologio mostrano l'ora di Greenwich e le lancette nere mostrano l'ora locale, che differisce di 10 minuti: il sistema del fuso orario si è sviluppato, sostituendo l'ora solare locale Una libreria intuitiva e robusta per lavorare con orari e date è finalmente disponibile in Java (Parte 2).  - 2     . Ma il fatto fondamentale è che i fusi orari sono creati dai politici e sono spesso utilizzati per dimostrare il controllo politico su un’area. Come ogni politica, le regole relative ai fusi orari spesso sfidano la logica. Inoltre, queste regole possono cambiare, e spesso cambiano, senza alcun preavviso. Le regole del fuso orario sono compilate da un gruppo internazionale che pubblica il database IANA Time Zone . Contiene l'identificatore di ciascuna regione della Terra e la storia del fuso orario cambia per essa. Gli identificatori assomigliano a "Europa/Londra" o "America/New_York" . Prima del rilascio dell'API java.time , la classe TimeZone veniva utilizzata per rappresentare un fuso orario . Ora viene utilizzato ZoneId . Ci sono due differenze fondamentali tra loro. Innanzitutto ZoneId è immutabile, il che rende possibile, tra le altre cose, memorizzare oggetti di questa classe in variabili statiche. In secondo luogo, le regole stesse sono memorizzate nella classe ZoneRules e non nello ZoneId stesso , e per ottenerle è necessario chiamare il metodo getRules() sull'oggetto della classe ZoneId . Una caratteristica comune a tutti i fusi orari è un offset fisso da UTC/Greenwich . Molto spesso lo usi quando parli di differenze orarie tra diverse città, come "New York è 5 ore indietro rispetto a Londra". La classe ZoneOffset , discendente di ZoneId , rappresenta la differenza oraria con il meridiano primo che passa per Greenwich a Londra. Dal punto di vista di uno sviluppatore, sarebbe fantastico non dover avere a che fare con i fusi orari e le loro complessità. L'API java.time ti consente di farlo finché è possibile. Ove possibile, utilizzare le classi LocalDate, LocalTime, LocalDateTime e Instant . Laddove non puoi fare a meno dei fusi orari, utilizza la classe ZonedDateTime . Classe ZonedDateTimeti consente di convertire date e ore dalle unità di misura umane, che vediamo su calendari e orologi, a unità meccaniche. Di conseguenza, puoi creare un ZonedTimeDate sia dalla classe Local che dalla classe Instant : ZoneId zone = ZoneId.of("Europe/Paris"); LocalDate date = LocalDate.of(2014, Month.JUNE, 10); ZonedDateTime zdt1 = date.atStartOfDay(zone); Instant instant = Instant.now(); ZonedDateTime zdt2 = instant.atZone(zone);     una delle caratteristiche più spiacevoli dei fusi orari è la cosiddetta ora legale. Con il passaggio dell'ora legale da e verso Greenwich, la differenza di fuso orario con Greenwich cambia due (o più) due volte l'anno, solitamente aumentando in primavera e diminuendo in autunno. Quando ciò accade, dobbiamo cambiare tutti gli orologi di casa nostra. Nelle classi java.time , i dati di offset sono rappresentati come "trasformazioni di offset" . In primavera ciò provoca un "gap" nel tempo, quando alcuni valori temporali sono impossibili, e in autunno, al contrario, alcuni valori temporali si verificano due volte. Tutto ciò è supportato dalla classe ZonedDateTime tramite i suoi metodi factory e i metodi di conversione. Ad esempio, aggiungendo un giorno si aggiunge un giorno logico, che può essere rappresentato da più o meno di 24 ore se si passa all'ora legale o viceversa. Allo stesso modo, il metodo atStartOfDay() è chiamato così perché non possiamo garantire che il giorno inizi esattamente a mezzanotte: dobbiamo tenere conto dell'intervallo di tempo quando si passa all'ora legale. E un ultimo consiglio riguardante l'ora legale. Se si desidera dimostrare di aver tenuto conto della sovrapposizione temporale durante la transizione dall'estate all'inverno (quando lo stesso valore temporale appare due volte), è possibile utilizzare uno dei due metodi speciali progettati per tali situazioni: Questi metodi restituiranno il valore precedente o successivo zdt = zdt.withEarlierOffsetAtOverlap(); zdt = zdt.withLaterOffsetAtOverlap();     valore , se l'oggetto rimane intrappolato in una sovrapposizione durante il passaggio dall'ora legale a quella invernale. In tutte le altre situazioni, i valori restituiti saranno gli stessi.
Intervalli di tempo
    Tutte le classi di cui abbiamo discusso in precedenza funzionano come punti sulla sequenza temporale. Sono necessarie due classi di valori aggiuntive per rappresentare gli intervalli di tempo. La classe Duration rappresenta un periodo di tempo, misurato in secondi e nanosecondi. Ad esempio, "23,6 secondi". La classe Period rappresenta un periodo di tempo misurato in anni, mesi e giorni. Ad esempio: "3 anni, 2 mesi e 6 giorni". Questi intervalli possono essere aggiunti o sottratti da una data o da un'ora: Period sixMonths = Period.ofMonths(6); LocalDate date = LocalDate.now(); LocalDate future = date.plus(sixMonths);
Formattazione e analisi
    Un intero pacchetto è progettato per formattare e visualizzare date e orari: java.time.format . Il pacchetto ruota attorno alla classe DateTimeFormatter e alla sua factory DateTimeFormatterBuilder . I modi più comuni per creare un formattatore sono tramite metodi statici e costanti in DateTimeFormatter , tra cui:
  • Costanti per i formati comuni descritti nell'ISO, come ISO_LOCAL_DATE.
  • Modelli identificati da lettere, come ofPattern("dd/MM/uuuu").
  • Stili localizzati come ofLocalizedDate(FormatStyle.MEDIUM).
    Una volta creato un formattatore, in genere lo si utilizza passandolo al metodo della classe data appropriato: DateTimeFormatter f = DateTimeFormatter.ofPattern("dd/MM/uuuu"); LocalDate date = LocalDate.parse("24/06/2014", f); String str = date.format(f);     in questo modo, il codice responsabile della formattazione dell'output della data viene isolato in una classe separata. Se è necessario specificare separatamente le impostazioni locali per la formattazione della data, utilizzare il metodo di formattazione withLocale(Locale) . Le classi responsabili del calendario, del fuso orario e dell'input/output dei numeri frazionari hanno metodi simili. Se hai bisogno di ulteriori opzioni di regolazione, consulta la documentazione per la classe DateTimeFormatterBuilder , che ti consente di creare formattatori complessi passo dopo passo. Consente inoltre di impostare l'analisi del testo senza distinzione tra maiuscole e minuscole, ignorare alcuni errori di analisi, impostare offset ed elementi opzionali.
Linea di fondo
     L'API java.time è un nuovo modello completo per lavorare con data e ora in Java SE 8 . Porta le idee e le implementazioni di Joda-Time al livello successivo e consente infine agli sviluppatori di evitare l'utilizzo di java.util.Date e Calendar . Ora lavorare con date e orari può essere divertente!      Articolo originale
Commenti
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION