2015-09-15 14 views
10

Esiste un modo in JodaTime per creare una Data/DataTime che sarà sempre più piccola/più grande di qualsiasi altra Data/DataTempo? Qualcosa sulla falsariga diMin/Max Data/DataTempo in JodaTime

DateTime bigBang = DateTime.xxx(); 
DateTime endOfUniverse = DateTime.yyy(); 

Vincolo: non voglio usare le librerie Date standard di Java.

+1

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? –

+2

Con Java 8, è semplicemente ['LocalDateTime.MAX'] (https://docs.oracle.com/javase/8/docs/api/java/time/LocalDateTime.html#MAX) (risp. MIN) – Tunaki

+0

@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. –

risposta

8

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 
+1

Solo una nota a margine, le date min/max estreme supportate da JodaTime potrebbero essere: new DateTime (Long.MIN_VALUE); nuovo DateTime (Long.MAX_VALUE); –

2

Quando tutte le date si trovano nello stesso Fuso orario, è possibile creare l'oggetto DateTime con i campi assegnati al valore minimo o massimo.
Tuttavia quando si utilizza questo costruttore

DateTime(int year, int monthOfYear, int dayOfMonth, int hourOfDay, int minuteOfHour, int secondOfMinute) 

con Years.MAX_VALUE.getYears() Ho seguito eccezione:

enter image description here

Quindi, utilizzando il numero massimo di anni dalla eccezioni, ho si avvicinò con la seguente fine dateTime -universe:

DateTime dtMax = new DateTime(292278993, 12, 31, 23, 59, 59); 
System.out.println(dtMax); 
// prints 292278993-12-31T23:59:59 

Vedi documentation per più d etails.
Anche una discussione interessante può essere letta here.

+0

Dipende dalla cronologia utilizzata. In CopticChronology, il numero massimo di anni è 292272708 – Tunaki

+0

ISOChronology viene utilizzato nell'esempio sopra. – MaxZoom

0

Dopo aver letto un sacco di diverse tangenti su questo, alla fine ho deciso di capire un caso minimo che funziona per il minimo e massimo per il fuso orario UTC. E si scopre che il tentativo di usare lo MIN_VALUE e lo MAX_VALUELong mi manda giù per le tracce dei conigli.

Quindi, dato il seguente frammento di codice:

new DateTime(milliseconds, DateTimeZone.UTC) 

qui sono i valori minimi/massimi che lavorano per milliseconds (testato in Java 1.7):

UTC_DATE_TIME_MIN_VALUE_IN_MILLIS = 9223372017129599999L 
UTC_DATE_TIME_MAX_VALUE_IN_MILLIS = -9223372017043200000L 

Entrambi questi valori sono circa 20 miliardi di distanza da Long.MIN_VALUE e Long.MAX_Value.

Problemi correlati