2012-06-20 23 views
5

Sto cercando di implementare Joda-Time per il conto alla rovescia per Natale, ma finora sono colpito. Ho provato java.util.Date e molte domande e risposte StackOverflow suggerivano di usare Joda-Time. Ma non riesco a farlo funzionare. Alcuni codici danno risposte diverse.Conto alla rovescia per Natale con Joda-Time

Ecco alcuni codici che ho provato,

DateTime now = new DateTime(); 
DateTime christmas = new DateTime(2012, 12, 25, 8, 0, 0, 0); 
Days daysToChristmas = Days.daysBetween(today, christmas); 
System.out.println(daysToChristmas.toString()); 

E Questo stampa P187D come risposta.

DateTime start = new DateTime(DateTime.now()); 
DateTime end = new DateTime(2012, 12, 25, 0, 0, 0 ,0); 
Interval interval = new Interval(start, end); 
Period period = interval.toPeriod(); 
System.out.println("Seconds " + period.getSeconds()); 
System.out.println("Minutes " + period.getMinutes()); 
System.out.println("Hours " + period.getHours()); 
System.out.println("Days " + period.getDays()); 

E questo stampe seguente risultato,

Seconds 36 
Minutes 21 
Hours 7 
Days 4 

dove ho sbagliato?

+0

Cosa c'è che non va nel primo codice? –

+0

Stampa P187D. Come ottengo giorni, ore, minuti e secondi da quell'oggetto? –

risposta

11

Si deve usare un Period al fine di determinare il numero di mesi/giorni/etc coinvolti:

Period period = new Period(start, end); 

Conversione di un Interval ad un periodo sarebbe stato troppo bene, ma di sovraccarico senza parametri include tutto unità di periodo - e non stavi stampando i mesi.

Ora se si solo desidera giorni, ore, minuti, secondi, quindi è necessario creare un appropriato PeriodType, ad es.

PeriodType periodType = PeriodType.dayTime().withMillisRemoved(); 
Period period = new Period(start, end, periodType); 

Quindi puoi chiedere quei singoli campi e tutto dovrebbe andare bene.

(Si potrebbe effettivamente utilizzare solo dayTime(), dato che le Millis non interferirà con qualsiasi altra cosa.)

Quindi è possibile costruire il vostro periodo direttamente dal start e end come sopra, o se si desidera mantenere il Interval, è possibile utilizzare:

Period period = interval.toPeriod(periodType); 
+0

Non posso credere di dirti questo di tutte le persone, ma ... credo che tu non sia corretto riguardo alla prima frase. La classe ['Interval'] (http://www.joda.org/joda-time/apidocs/org/joda/time/Interval.html) in effetti comprende gli oggetti DateTime iniziali e finali. Sospetto che tu abbia confuso Interval con la classe ['Duration'] (http://www.joda.org/joda-time/apidocs/org/joda/time/Duration.html). In Joda-Time, una durata è un lasso di tempo in millisecondi, senza una posizione sulla timeline. L'uso dell'intervallo del codice di esempio della domanda è corretto, se non necessario. –

+0

@BasilBourque: hai sicuramente ragione che mi stavo confondendo con la durata. "Interval" è a mio avviso ancora * logicamente * il tipo errato in quanto è documentato essere il tempo tra due * istanti *, il che significa che non dovrebbe esserci alcuna cronologia coinvolta - tuttavia "Intervallo" memorizza anche una "cronologia", quindi puoi in effetti recupera gli end point appropriati come valori di "DateTime". Penso che sia probabilmente meglio semplicemente strofinare il primo paio di frasi, che farò ora :) –

+0

@BasilBourque: ho deciso di ristrutturare un po 'di più le cose, alla fine. Grazie mille per la correzione! –

2

Il primo codice stampa P187D, nel formato ISO 8601.

Il secondo codice stampa solo 4 giorni perché mancano i mesi (period.getMonths()).

+0

Beh, c'è un modo per convertire mesi in date, non ho bisogno di mesi, ho solo bisogno di giorni. –

+0

@Jon La risposta di Skeet spiega già come farlo. – tibtof

2

È possibile utilizzare questo codice.

DateTime dt1 = new DateTime(); 
DateTime dt2 = new DateTime(2012, 12, 25, 0, 0, 0, 0); 
int seconds=Seconds.secondsBetween(dt1, dt2).getSeconds(); 

int noOfDays=seconds/(24*60*60); 
int noOfHours=(seconds%(24*60*60))/(60*60); 
int noOfMinutes=((seconds%(24*60*60))%(60*60))/60; 
int noSec=((seconds%(24*60*60))%(60*60))%60; 

System.out.println("Time Left For christmas"); 
System.out.println("Days Left="+noOfDays+" Hours="+noOfHours+" Minutes="+noOfMinutes+" Seconds="+noSec); 
Problemi correlati