2009-09-17 8 views
56

Sto utilizzando la libreria Joda-Time con Java. Sto avendo qualche difficoltà nel provare a trasformare un oggetto Period in una stringa nel formato di "x giorni, x ore, x minuti".Periodo da stringa

Questi oggetti Periodo vengono creati innanzitutto aggiungendo un numero di secondi (vengono serializzati in XML come secondi e quindi ricreati da essi). Se uso semplicemente i metodi getHours() in loro, tutto ciò che ottengo è zero e lo totale di quantità di secondi con getSeconds.

Come posso fare in modo che Joda calcoli i secondi nei rispettivi campi, come giorni, ore, ecc ...?

+1

Correlato: http://stackoverflow.com/q/10829870/11236 – ripper234

risposta

91

È necessario normalizzare il periodo perché se lo si costruisce con il numero totale di secondi, questo è l'unico valore che ha. Normalizzare si romperà giù nel numero totale di giorni, minuti, secondi, ecc

Edit by ripper234 - Aggiunta di un TL;DR version: PeriodFormat.getDefault().print(period)

Ad esempio:

public static void main(String[] args) { 
    PeriodFormatter daysHoursMinutes = new PeriodFormatterBuilder() 
    .appendDays() 
    .appendSuffix(" day", " days") 
    .appendSeparator(" and ") 
    .appendMinutes() 
    .appendSuffix(" minute", " minutes") 
    .appendSeparator(" and ") 
    .appendSeconds() 
    .appendSuffix(" second", " seconds") 
    .toFormatter(); 

    Period period = new Period(72, 24, 12, 0); 

    System.out.println(daysHoursMinutes.print(period)); 
    System.out.println(daysHoursMinutes.print(period.normalizedStandard())); 
} 

stamperà :

24 minutes and 12 seconds
3 days and 24 minutes and 12 seconds

Quindi è possibile vedere l'output per il periodo non normalizzato semplicemente ignora il numero di ore (non ha convertito le 72 ore in 3 giorni).

+0

o.O ... Credo che avrei dovuto essere più prolisso. – Jherico

+0

Grazie per l'eccellente risposta. –

+1

-1 da me, perché è difficile da localizzare. – Trejkaz

12
Period period = new Period(); 
    // prints 00:00:00 
    System.out.println(String.format("%02d:%02d:%02d", period.getHours(), period.getMinutes(), period.getSeconds())); 
    period = period.plusSeconds(60 * 60 * 12); 
    // prints 00:00:43200 
    System.out.println(String.format("%02d:%02d:%02d", period.getHours(), period.getMinutes(), period.getSeconds())); 
    period = period.normalizedStandard(); 
    // prints 12:00:00 
    System.out.println(String.format("%02d:%02d:%02d", period.getHours(), period.getMinutes(), period.getSeconds())); 
+2

Peccato che non si riesca a passare la stringa di formato a Period o al suo formattatore per ottenere questo effetto. – greenoldman

22

È anche possibile utilizzare il formattatore predefinito, che è buono per la maggior parte dei casi:

Period period = new Period(startDate, endDate); 
System.out.println(PeriodFormat.getDefault().print(period)) 
+0

Non direi "molti casi", ma è utile, sì. – skaffman

+0

Dovrebbe essere parte della risposta accettata. – ripper234

+0

Se i tuoi utenti si preoccupano veramente del numero di secondi di fazione, tuttavia è molto utile. –

2
PeriodFormatter daysHoursMinutes = new PeriodFormatterBuilder() 
    .appendDays() 
    **.appendSuffix(" day", " days") 
    .appendSeparator(" and ") 
    .appendMinutes() 
    .appendSuffix(" minute", " minutes")** 
    .appendSeparator(" and ") 
    .appendSeconds() 
    .appendSuffix(" second", " seconds") 
    .toFormatter(); 

vi state perdendo le ore, ecco perché. Aggiungi ore dopo giorni e il problema è risolto.