Dovrei usare le classi di data e ora di Java o andare con una libreria di terze parti come Joda Time?


147

Sto creando un sistema basato sul Web che verrà utilizzato in paesi di tutto il mondo. Un tipo di dati che devono essere memorizzati sono le date e gli orari.

Quali sono i vantaggi e gli svantaggi dell'utilizzo delle classi di data e ora Java rispetto alle librerie di terze parti come Joda Time ? Immagino che queste librerie di terze parti esistano per una buona ragione, ma non le ho mai confrontate da solo.


5
Per chiarire alcuni commenti ... Mentre continua Joda-Time, il suo successore JSR 310: l'API Date and Time è effettivamente programmato per far parte di Java 8 con il pacchetto java.time . Oracle ha una bozza di un tutorial . JDBC 4.2 gestirà i nuovi tipi di dati.
Basil Bourque,

Risposte:


197

EDIT: Ora che Java 8 è stato rilasciato, se puoi usarlo, fallo! java.timeè persino più pulito di Joda Time, a mio avviso. Tuttavia, se sei bloccato prima di Java-8, continua a leggere ...

Max ha chiesto i pro e i contro dell'utilizzo di Joda ...

Professionisti:

  • Funziona molto bene. Sospetto fortemente che ci siano molti meno bug in Joda rispetto alle librerie Java standard. Alcuni dei bug nelle librerie Java sono davvero difficili (se non impossibili) da correggere a causa del design.
  • È progettato per incoraggiarti a pensare alla gestione di data / ora nel modo giusto, separando il concetto di "ora locale" (ad es. "Svegliami alle 7, ovunque io sia") e un istante nel tempo ("Chiamo James alle 15:00 PST; potrebbe non essere le 15:00 dove si trova, ma è lo stesso istante ")
  • Credo che rende più facile per aggiornare il database di fuso orario, che fa il cambiamento relativamente frequente
  • Ha una buona storia di immutabilità, che rende la vita dell'IME molto più semplice.
  • Partendo dall'immutabilità, tutti i formattatori sono thread-safe, il che è fantastico perché quasi sempre vuoi riutilizzare un singolo formattatore attraverso l'applicazione
  • Avrai un vantaggio sull'apprendimento java.timein Java 8, poiché sono almeno in qualche modo simili

Contro:

  • È un'altra API da imparare (anche se i documenti sono abbastanza buoni)
  • È un'altra libreria su cui costruire e distribuire
  • Quando usi Java 8, c'è ancora del lavoro da fare per migrare le tue abilità
  • Non sono riuscito a utilizzare DateTimeZoneBuilderefficacemente in passato. Questo è un caso d'uso molto raro.

Per rispondere all'idea di oxbow_lakes di costruire efficacemente la tua piccola API, ecco le mie opinioni sul perché questa è una cattiva idea:

  • È lavoro. Perché lavorare quando è già stato fatto per te?
  • È molto più probabile che un nuovo arrivato nella tua squadra abbia familiarità con Joda che con l'API nostrana
  • Probabilmente sbaglierai per qualsiasi cosa al di là degli usi più semplici ... e anche se inizialmente pensi di aver bisogno solo di funzionalità semplici, queste cose hanno l'abitudine di diventare più complicate, un po 'alla volta. La manipolazione di data e ora è difficile da eseguire correttamente. Inoltre, le API Java integrate sono difficili da usare correttamente: basta guardare le regole su come funziona l'aritmetica data / ora dell'API del calendario. Costruire qualcosa sopra a questi è una cattiva idea piuttosto che usare una libreria ben progettata per cominciare.

5
@adi: aggiornato - è ancora valido, ma si spera che JSR-310 farà parte di Java 8, ma non faceva parte di Java 7.
Jon Skeet

2
@JonSkeet Probabilmente dovrebbe essere aggiornato dall'introduzione di java-8
Sionnach733,

@ Sionnach733: non ho intenzione di aggiornare tutto, ma aggiungerò qualcosa all'inizio.
Jon Skeet,

2
Esiste un backport java.time.*per Java 6 e 7: threeten.org/threetenbp
Miscreant

24

Bene, a meno che tu non intenda aspettare Java 8, sperando che implementino un'API migliore per manipolare data e ora, sì, per favore, usa Joda-Time . Risparmia tempo ed evita molti mal di testa.


Pro e contro? Non ho mai usato il tempo di Joda - sarebbe interessante sapere cosa piace alla gente.
Max Stewart,

15

La risposta è: dipende

JODA (e JSR-310) è una libreria di data / ora completamente funzionale, incluso il supporto per l'uso con più sistemi di calendario.

Personalmente ho trovato JODA un passo troppo avanti in termini di complessità per ciò di cui ho bisogno. I 2 errori principali (IMHO) nella java Datee nelle Calendarclassi standard sono:

  1. Sono mutabili
  2. Mischiano il concetto di un anno-mese-giorno da un istante

Anche se questi sono affrontati da JODA, troverai abbastanza facile rotolare le tue classi per YearMonthDaye Instant, che usano entrambe le classi java sotto il cofano per calcoli "calendari" reali. Quindi non devi familiarizzare con un'API di> 100 classi, un diverso meccanismo di formattazione / analisi ecc.

Naturalmente, se hai bisogno di una rappresentazione completa di diverse cronologie (ad esempio l'ebraico) o desideri essere in grado di definire il tuo sistema di calendario immaginario (ad esempio per un gioco che stai scrivendo), forse JODA o JRS-310 è per te. Altrimenti, suggerirei che il rotolamento è probabilmente la strada da percorrere.

Il responsabile delle specifiche JSR-310 è Stephen Colebourne che ha scritto JODA al 1 ° posto, quindi sostituirà logicamente JODA.


16
non dovrebbe essere reinventato da non specialisti, IMO.
Jon Skeet,

6
Nemmeno io sono un idiota, ma ho ancora avuto problemi con le API Java D&T. Sono dolorosamente facili da usare in modo improprio. Il motivo per cui le persone hanno maggiori probabilità di essere in grado di utilizzare correttamente Joda è che Joda è progettato meglio: ti incoraggia a fare la cosa giusta.
Jon Skeet,

6
Mi fido di un esperto su di me in qualsiasi giorno della settimana per quanto riguarda le API di data / ora. Non è che questa sia un'API di terze parti casuale senza che nessun altro la usi. L'argomento "> 100 classi" è un uomo di paglia, perché ovviamente non è necessario impararli tutti.
Jon Skeet,

5
Immagino che dovremo accettare di dissentire. Qualsiasi data / ora di fiducia scritta da esperti e ben progettata, che mi evita di dover fare lavori sporchi con il tempo, conta come un "must have" dal mio punto di vista. Nell'ultimo anno ho imparato ad odiare la misurazione del tempo umano con passione.
Jon Skeet,

5
Avere il tuo quando Joda esiste è un'idea semplicemente terribile. Basta non farlo. È vero che Joda ha decine di lezioni che non hai intenzione di usare, ma la risposta a questa domanda è abbastanza semplice: non usare quelle che non ti servono. Ci sono così tante cose che possono andare storte nello scrivere la tua libreria di questo tipo: lo sforzo che dovrai fare è enorme, sia nello sviluppo che nei test. Oppure puoi semplicemente aggiungere una libreria. Quindi, Joda ha l'ulteriore vantaggio che nuove reclute per il tuo team potrebbero averlo usato prima, ma non avranno usato la tua libreria nostrana.
Dawood ibn Kareem,

7

Tutto dipende da cosa stai facendo con le date. Se li stai semplicemente persistendo, probabilmente le date integrate in Java faranno probabilmente tutto ciò che desideri. Tuttavia, se stai effettuando una manipolazione estesa della data, probabilmente stai meglio con Joda.


7

Dovresti usare una libreria Joda-Time, perché:

  1. Joda-Time supporta lo standard ISO 8601 , che è un modo standard di
    rappresentazione della data.
  2. Aggiungere e sottrarre un giorno / mese / anno è più facile in Joda-Time rispetto a java.util.date.
  3. L'inizializzazione entro una data è molto più semplice in Joda-Time.
  4. Joda-Time supporta anche il fuso orario.
  5. Joda-Time ha una migliore analisi integrata. Una data errata come "2014-02-31" viene generata come errore:Exception in thread "main" org.joda.time.IllegalFieldValueException: Cannot parse "2014-02-31": Value 31 for dayOfMonth must be in the range [1,28].

Potrebbe piacerti questa pagina per maggiori dettagli: http://swcodes.blogspot.com/

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.