어떻게 자바에 있는 기간" 예쁜 인쇄" 수 있을까요?
누군가 예쁜 밀리초 단위로 C#가 갖고 있는 같은 방식으로 번호 인쇄할 수 있는 자바 도서관의 알고 있나요?
예:123456-1로 4d1h3m5s로 출력될 것이다.
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
.
Joda 시간 꽤 좋은 방법은 PeriodFormatterBuilder을 사용하여 이렇게 해야 한다.
퀵윈: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);
아파치 commons-lang 유용한 강좌 이 뿐만 아니라 DurationFormatUtils을 해낼 수 있습니다.
예.DurationFormatUtils.formatDurationHMS( 15362 * 1000 ) )
=> 4:16:02.000 (H:m:s.millis)DurationFormatUtils.formatDurationISO( 15362 * 1000 ) )
=> P0Y0M0DT4H16M2.000S, cf.ISO8601
자바 9+
Duration d1 = Duration.ofDays(0);
d1 = d1.plusHours(47);
d1 = d1.plusMinutes(124);
d1 = d1.plusSeconds(124);
System.out.println(String.format("%s d %sh %sm %ss",
d1.toDaysPart(),
d1.toHoursPart(),
d1.toMinutesPart(),
d1.toSecondsPart()));
2d1h 6m짜리 4s.
org.threeten.extra.AmountFormats.wordBased
는 스티븐 Colebourne, 합동 전략 검토한 310, java.time의 저자이며 Joda-Time에 의해 관리하는 ThreeTen-Extra 프로젝트, 표준 자바 8날짜 시간 수업하고 있는 AmountFormats 수업이 있었다.다만, 보다 콤팩트한 출력에 대한 옵션이 없기 때문에, 꽤 장황합니다.
Duration d = Duration.ofMinutes(1).plusSeconds(9).plusMillis(86);
System.out.println(AmountFormats.wordBased(d, Locale.getDefault()));
1 minute, 9 seconds and 86 milliseconds
순수 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());
Joda Time에는 이러한 수량을 나타낼 수 있는 클래스가 있으며 ISO8601 형식으로 렌더링할 수 있습니다.PT4D1H3M5S
,예.
Period period = new Period(millis);
String formatted = ISOPeriodFormat.standard().print(period);
원하는 형식이 아닌 경우 C# 스타일을 포함한 임의의 레이아웃을 조합할 수 있습니다.4d1h3m5s
.
Java 8에서는 PT8H6M12.345S와 같은 ISO 8601초 기반 표현을 사용하여 외부 라이브러리 없이 포맷할 수도 있습니다.
Joda-Time의 구축자-접근법에 대한 대안으로 패턴 기반 솔루션이 있습니다.이것은 내 도서관 Time4J에서 제공하는 것입니다.[ Duration ]클래스를 사용하는 예.포메터(가독성을 높이기 위해 일부 공간을 추가했습니다. 공간을 제거하면 원하는 C# 스타일이 됩니다):
IsoUnit unit = ClockUnit.MILLIS;
Duration<IsoUnit> dur = // normalized duration with multiple components
Duration.of(123456, unit).with(Duration.STD_PERIOD);
Duration.Formatter<IsoUnit> f = // create formatter/parser with optional millis
Duration.Formatter.ofPattern("D'd' h'h' m'm' s[.fff]'s'");
System.out.println(f.format(dur)); // output: 0d 0h 2m 3.456s
이 포메터는, 다음의 기간도 인쇄할 수 있습니다.java.time
-API(단, 해당 유형의 정규화 기능은 성능이 떨어집니다):
System.out.println(f.format(java.time.Duration.ofMillis(123456))); // output: 0d 0h 2m 3.456s
"123456 ms as long printed as 4d1h3m5s"라는 OP의 예상은 명백히 잘못된 계산으로 계산됩니다.나는 게으름을 이유로 생각한다.위에서 정의한 것과 같은 기간 포맷을 파서로 사용할 수도 있습니다.다음 코드는 "4d1h3m5s"가 다음 중 하나에 해당함을 나타냅니다.349385000 = 1000 * (4 * 86400 + 1 * 3600 + 3 * 60 + 5)
:
System.out.println(
f.parse("4d 1h 3m 5s")
.toClockPeriodWithDaysAs24Hours()
.with(unit.only())
.getPartialAmount(unit)); // 349385000
하나의 은 '수업하다'라는 클래스를 입니다.net.time4j.PrettyTime
:('어울리다', '하다', '4번 하다', '4번 하다').
String s = PrettyTime.of(Locale.ENGLISH).print(dur, TextWidth.NARROW);
System.out.println(s); // output: 2m 3s 456ms
s = PrettyTime.of(Locale.ENGLISH).print(dur, TextWidth.WIDE);
System.out.println(s); // output: 2 minutes, 3 seconds, and 456 milliseconds
s = PrettyTime.of(Locale.UK).print(dur, TextWidth.WIDE);
System.out.println(s); // output: 2 minutes, 3 seconds and 456 milliseconds
텍스트 너비는 약어 사용 여부를 제어합니다.목록 형식도 적절한 로케일을 선택하여 제어할 수 있습니다.예를 들어 표준 영어는 Oxform 콤마를 사용하는 반면 영국은 사용하지 않습니다.Time4J의 최신 버전 v5.5는 90개 이상의 언어를 지원하며 CLDR 저장소(업계 표준)에 기반한 번역을 사용합니다.
사용자 678573의 답변을 기반으로 한 Java 8 버전:
private static String humanReadableFormat(Duration duration) {
return String.format("%s days and %sh %sm %ss", duration.toDays(),
duration.toHours() - TimeUnit.DAYS.toHours(duration.toDays()),
duration.toMinutes() - TimeUnit.HOURS.toMinutes(duration.toHours()),
duration.getSeconds() - TimeUnit.MINUTES.toSeconds(duration.toMinutes()));
}
Java 8에는 PeriodFormatter가 없고 getHours, getMinutes 등의 메서드가 없기 때문에...
Java 8의 더 나은 버전을 보고 싶습니다.
또 다른 Java 9+ 솔루션:
private String formatDuration(Duration duration) {
List<String> parts = new ArrayList<>();
long days = duration.toDaysPart();
if (days > 0) {
parts.add(plural(days, "day"));
}
int hours = duration.toHoursPart();
if (hours > 0 || !parts.isEmpty()) {
parts.add(plural(hours, "hour"));
}
int minutes = duration.toMinutesPart();
if (minutes > 0 || !parts.isEmpty()) {
parts.add(plural(minutes, "minute"));
}
int seconds = duration.toSecondsPart();
parts.add(plural(seconds, "second"));
return String.join(", ", parts);
}
private String plural(long num, String unit) {
return num + " " + unit + (num == 1 ? "" : "s");
}
예.,
6 days, 21 hours, 2 minutes, 14 seconds
이것이 귀사의 사용 사례에 정확히 맞지 않을 수도 있다는 것을 알지만, Pretty Time이 도움이 될 수도 있습니다.
PrettyTime p = new PrettyTime();
System.out.println(p.format(new Date()));
//prints: “right now”
System.out.println(p.format(new Date(1000*60*10)));
//prints: “10 minutes from now”
언급URL : https://stackoverflow.com/questions/3471397/how-can-i-pretty-print-a-duration-in-java
'programing' 카테고리의 다른 글
프라이머리 SQL별 FIFO 값 감소 (0) | 2022.09.11 |
---|---|
Laravel Controller에서 콘솔에 쓰는 방법 (0) | 2022.09.11 |
MySQL을 사용하여 빈 필드 확인 (0) | 2022.09.11 |
jQuery를 사용하여 현재 URL을 가져오시겠습니까? (0) | 2022.09.11 |
다른 테이블에서 동일한 ID의 SQL 쿼리 수 행 (0) | 2022.09.11 |