java.time
Il progetto Joda-Time è ora in modalità di manutenzione. Il team consiglia la migrazione alle classi java.time.
Per min/max in java.time, vedere my Answer su una domanda simile.
Joda-time
Joda-Time tracce come un conteggio di milliseconds fin dall'epoca del primo momento di 1970 a UTC. Questo conteggio viene mantenuto utilizzando un numero intero 64-bitlong
. Quindi, tecnicamente, il massimo e il minimo sono i limiti +/- di un long
.
… new DateTime(Long.MIN_VALUE)
… new DateTime(Long.MAX_VALUE)
Joda-Time non ha tali valori minimo/massimo disponibili convenientemente come costanti. Al contrario, si noti che il successore di Joda-Time, java.time incorporato in Java 8 e versioni successive, offre effettivamente le costanti LocalDateTime.MIN
e LocalDateTime.MAX
.
A proposito, il team Joda-Time ha consigliato di migrare a java.time. Gran parte della funzionalità java.time viene backportata su Java 6 & 7 nello ThreeTen-Backport, ulteriormente adattato ad Android in ThreeTen-ABP.
Troppo grande, troppo piccolo
Attenzione di questi estremi. Il loro uso non è pratico. Varie librerie, app, database e altri sink/sorgenti di valori di data-ora possono avere limiti molto diversi, alcuni molto più grandi ma in genere molto più piccoli.
Ad esempio, molti sistemi utilizzano la vecchia tradizione UNIX & POSIX del tempo di tracciamento come un conteggio intero a 32 bit di interi secondi dal 1970-01-01T00: 00: 00Z. Il limite naturale di +/- 2 miliardi di secondi determina l'incombente Year 2038 Problem.
Un altro limite è la dimensione di visualizzazione fisica dei campi su moduli e report che prevedono solo quattro cifre in un numero di anno.
Soluzione
È possibile definire il proprio min/max.
È possibile che si desideri valori estremi come l'anno 0000 e l'anno 9999. Joda-Time supporta anni dopo 9.999, ma inserisco 4 cifre per adattarlo ai formati comunemente utilizzati per la visualizzazione sullo schermo e nei report. Visivamente, i quattro nove si distinguono come una data falsa.
Oppure è possibile che si desideri un valore minimo previsto appropriato per la propria logica aziendale. Se costruisci un nuovo sistema di fatturazione, sai che l'anno dovrebbe essere sempre quest'anno o più tardi.
Suggerisco di definire le costanti su una classe di supporto. Qualcosa del genere:
package com.example;
import org.joda.time.DateTime;
import org.joda.time.DateTimeZone;
public class JodaTimeHelper {
static final public DateTime START_OF_TIME = new DateTime(0000, 1, 1, 0, 0, 0, DateTimeZone.UTC);
static final public DateTime END_OF_TIME = new DateTime(9999, 1, 1, 0, 0, 0, DateTimeZone.UTC);
static final public DateTime MINIMUM_INVOICE_DATETIME = new DateTime(2015, 1, 1, 0, 0, 0, DateTimeZone.UTC);
}
Ecco la sintassi per chiamare quelle costanti.
System.out.println("START_OF_TIME: " + JodaTimeHelper.START_OF_TIME);
System.out.println("END_OF_TIME: " + JodaTimeHelper.END_OF_TIME);
System.out.println("END_OF_TIME: " + JodaTimeHelper. MINIMUM_INVOICE_DATETIME);
Quando eseguito.
START_OF_TIME: 0000-01-01T00:00:00.000Z
END_OF_TIME: 9999-01-01T00:00:00.000Z
MINIMUM_INVOICE_DATETIME: 2015-01-01T00:00:00.000Z
Penso che 'new DateTime (0)' ti darà il minimo 'DateTime' che può essere rappresentato. Solo una supposizione selvaggia, ma forse il valore massimo di 'long' sarebbe il massimo? –
Con Java 8, è semplicemente ['LocalDateTime.MAX'] (https://docs.oracle.com/javase/8/docs/api/java/time/LocalDateTime.html#MAX) (risp. MIN) – Tunaki
@TheodorosChatzigiannakis 0 dare 01/01/1970. Puoi sicuramente andare oltre nel passato con valori negativi. MIN_VALUE e MAX_VALUE non sono valori validi per DateTime, però. Sono OK per Instant. –