2009-09-17 5 views
56

자바를 사용하여 Joda-Time 라이브러리를 사용하고 있습니다. 나는 기간 개체를 "x 일, x 시간, x 분"형식의 문자열로 바꾸려는 데 어려움을 겪고 있습니다.문자열 기간

이 기간 개체는 초 단위로 XML에 serialize 된 다음 다시 만들어집니다. getHours() 등의 메소드를 사용하면 getSeconds를 사용하면 0이되고 은 총 초가됩니다.

Joda가 요일, 시간 등 각 필드에 초를 계산하도록하려면 어떻게해야합니까?

+1

관련 항목 : http://stackoverflow.com/q/10829870/11236 – ripper234

답변

91

당신은 당신이 초 총 개수로를 구성하는 경우, 그 그것이있는 유일한 값이기 때문에 기간을 정상화 할 필요가있다.

편집 ripper234 등에 의해, 그것은 일, 분, 초의 총 개수로를 무너 뜨리는 것 정규화 - A는 TL;DR version 추가 : 예를 들어 PeriodFormat.getDefault().print(period)

:

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

인쇄됩니다 :

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

정규화되지 않은 기간에 대한 출력이 시간 수를 무시한다는 것을 알 수 있습니다 (72 시간을 3 일로 변환하지 않음). 그 이유는, 당신이 시간을 놓치고

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

o.O ... 나는 좀 더 장황한 것이 틀림 없어. – Jherico

+0

훌륭한 답변 주셔서 감사합니다. –

+1

-1, 현지화가 어렵 기 때문에 – 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

이 효과를 얻으려면 형식 문자열을 기간 또는 해당 포매터로 전달할 수 없습니다. – greenoldman

22

은 또한 대부분의 경우 좋은 기본 포맷을 사용할 수 있습니다. 며칠 후 추가하고 문제를 해결했습니다.

+0

"대부분의 경우"라고 말하지는 않겠지 만 유용합니다. – skaffman

+0

허용되는 답변의 일부 여야합니다. – ripper234

+0

사용자가 파벌 초 수에 대해 정말로 신경을 쓰면 매우 유용합니다. –

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

: