Java에서 Duration을 어떻게 “예쁘게 인쇄”할 수 있습니까? #과 같은

C #과 같은 방식으로 밀리 초 단위로 숫자를 인쇄 할 수있는 Java 라이브러리를 아는 사람이 있습니까?

예를 들어 123456 ms는 4d1h3m5s로 인쇄됩니다.



답변

Joda TimePeriodFormatterBuilder를 사용하여이를 수행하는 꽤 좋은 방법을 가지고 있습니다.

빠른 승리: PeriodFormat.getDefault().print(duration.toPeriod());

예 :

//import org.joda.time.format.PeriodFormatter;
//import org.joda.time.format.PeriodFormatterBuilder;
//import org.joda.time.Duration;

Duration duration = new Duration(123456); // in milliseconds
PeriodFormatter formatter = new PeriodFormatterBuilder()
     .appendDays()
     .appendSuffix("d")
     .appendHours()
     .appendSuffix("h")
     .appendMinutes()
     .appendSuffix("m")
     .appendSeconds()
     .appendSuffix("s")
     .toFormatter();
String formatted = formatter.print(duration.toPeriod());
System.out.println(formatted);


답변

Java 8 Duration.toString()과 약간의 정규식을 사용하여 간단한 솔루션을 만들었습니다 .

public static String humanReadableFormat(Duration duration) {
    return duration.toString()
            .substring(2)
            .replaceAll("(\\d[HMS])(?!$)", "$1 ")
            .toLowerCase();
}

결과는 다음과 같습니다.

- 5h
- 7h 15m
- 6h 50m 15s
- 2h 5s
- 0.1s

사이에 공백을 넣지 않으려면 replaceAll.


답변

Apache commons-lang은이 작업을 수행하는 데 유용한 클래스를 제공합니다. DurationFormatUtils


DurationFormatUtils.formatDurationHMS( 15362 * 1000 ) )=> 4 : 16 : 02.000 (H : m : s.millis)
DurationFormatUtils.formatDurationISO( 15362 * 1000 ) )=> P0Y0M0DT4H16M2.000S, cf. ISO8601


답변

JodaTime는 갖는 Period이러한 양을 나타낼 수있는 클래스 및 (통해 렌더링 될 수 IsoPeriodFormat투입) ISO8601 예 형식 PT4D1H3M5S, 예를

Period period = new Period(millis);
String formatted = ISOPeriodFormat.standard().print(period);

해당 형식이 원하는 형식이 아닌 경우 PeriodFormatterBuilderC # 스타일을 포함하여 임의의 레이아웃을 조합 할 수 있습니다 4d1h3m5s.


답변

Java 8 에서는 PT8H6M12.345S와 같은 ISO 8601 초 기반 표현을 사용하여 외부 라이브러리없이 형식화 하는 toString()방법을 사용할 수도 있습니다 .java.time.Duration


답변

다음은 순수한 JDK 코드를 사용하여 수행하는 방법입니다.

import javax.xml.datatype.DatatypeFactory;
import javax.xml.datatype.Duration;

long diffTime = 215081000L;
Duration duration = DatatypeFactory.newInstance().newDuration(diffTime);

System.out.printf("%02d:%02d:%02d", duration.getDays() * 24 + duration.getHours(), duration.getMinutes(), duration.getSeconds());


답변

org.threeten.extra.AmountFormats.wordBased

ThreeTen-추가 스티븐 Colebourne, JSR 310의 저자에 의해 유지되는 프로젝트 java.timeJoda-시간 ,가 AmountFormats표준 Java 8 날짜 시간 클래스와 함께 작동 클래스를. 더 간결한 출력을위한 옵션은 없지만 상당히 장황합니다.

Duration d = Duration.ofMinutes(1).plusSeconds(9).plusMillis(86);
System.out.println(AmountFormats.wordBased(d, Locale.getDefault()));

1 minute, 9 seconds and 86 milliseconds