2009-09-17 11 views
56

używam biblioteki Joda-Time z Java. Mam trudności z przekształceniem obiektu Period na ciąg znaków w formacie "x dni, x godzin, x minut".Okres ciąg

Okres te przedmioty są najpierw poprzez dodanie ilości sekund do nich (są szeregowane XML jak sekundy, a następnie odtworzone z nich). Jeśli po prostu użyję w nich metod getHours() itd., Otrzymam tylko zero i suma sekund z getSeconds.

Jak mogę dokonać Joda obliczyć sekund w odpowiednich dziedzinach, jak dni, godziny, itp ...?

+1

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

Odpowiedz

91

trzeba znormalizować okres bo jeśli budować go z ogólnej liczby sekund, to jest to jedyna wartość ma. Normalizowanie to rozbicie go na łączną liczbę dni, minuty, sekundy, itp

Edycja przez ripper234 - Dodawanie TL;DR version: PeriodFormat.getDefault().print(period)

Na przykład:

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())); 
} 

wypisze :

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

Widać więc, że dane wyjściowe z okresu nienormalizowanego po prostu ignorują liczbę godzin (nie przekształciły się z 72 godzin na 3 dni).

+0

o.O ... Myślę, że powinienem być bardziej gadatliwy. – Jherico

+0

Dzięki za doskonałą odpowiedź. –

+1

-1 ode mnie, ponieważ jest to trudne do zlokalizowania. – 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

Szkoda, że ​​nie można przekazać ciąg formatu do okresu lub jego Formatter aby uzyskać ten efekt. – greenoldman

22

Można również użyć formatowania domyślnego, co jest dobre dla większości przypadków:

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

Nie powiedziałbym "większość przypadków", ale jest to przydatne, tak. – skaffman

+0

Powinien być częścią zaakceptowanej odpowiedzi. – ripper234

+0

Jeśli Twoi użytkownicy naprawdę dbają o liczbę sekund frakcji, to jest to bardzo przydatne. –

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

tracisz godziny, dlatego. Dołączaj godziny po dniach i problem został rozwiązany.

Powiązane problemy