혼란 스러워요. 이 스레드를 우연히 만난 후 형식이있는 카운트 다운 타이머를 형식화하는 방법을 알아 내려고했습니다 hh:mm:ss
.
여기 내 시도가 있습니다-
//hh:mm:ss
String.format("%02d:%02d:%02d",
TimeUnit.MILLISECONDS.toHours(millis),
TimeUnit.MILLISECONDS.toMinutes(millis) -
TimeUnit.MINUTES.toMinutes(TimeUnit.MILLISECONDS.toHours(millis)),
TimeUnit.MILLISECONDS.toSeconds(millis) -
TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS.toMinutes(millis)));
따라서와 같은 값을 시도하면 3600000ms
얻을 수 01:59:00
있습니다 01:00:00
. 분명히 내 논리에 문제가 있지만 현재는 그것이 무엇인지 알 수 없습니다!
누구든지 도울 수 있습니까?
편집하다 –
고쳤다. 밀리 초를 hh:mm:ss
형식화 하는 올바른 방법은 다음과 같습니다.
//hh:mm:ss
String.format("%02d:%02d:%02d",
TimeUnit.MILLISECONDS.toHours(millis),
TimeUnit.MILLISECONDS.toMinutes(millis) -
TimeUnit.HOURS.toMinutes(TimeUnit.MILLISECONDS.toHours(millis)),
TimeUnit.MILLISECONDS.toSeconds(millis) -
TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS.toMinutes(millis))));
문제는 이것이었다 TimeUnit.MINUTES.toMinutes(TimeUnit.MILLISECONDS.toHours(millis))
. 그것은이를 했어야 TimeUnit.HOURS.toMinutes(TimeUnit.MILLISECONDS.toHours(millis))
대신.
답변
당신은 정말 가까이 있었다 :
String.format("%02d:%02d:%02d",
TimeUnit.MILLISECONDS.toHours(millis),
TimeUnit.MILLISECONDS.toMinutes(millis) -
TimeUnit.HOURS.toMinutes(TimeUnit.MILLISECONDS.toHours(millis)), // The change is in this line
TimeUnit.MILLISECONDS.toSeconds(millis) -
TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS.toMinutes(millis)));
다음을 사용하여 millisseconds에 시간을 변환 한 분 대신 시간 .
BTW, 나는 당신의 TimeUnit
API 사용을 좋아합니다 🙂
테스트 코드는 다음과 같습니다.
public static void main(String[] args) throws ParseException {
long millis = 3600000;
String hms = String.format("%02d:%02d:%02d", TimeUnit.MILLISECONDS.toHours(millis),
TimeUnit.MILLISECONDS.toMinutes(millis) - TimeUnit.HOURS.toMinutes(TimeUnit.MILLISECONDS.toHours(millis)),
TimeUnit.MILLISECONDS.toSeconds(millis) - TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS.toMinutes(millis)));
System.out.println(hms);
}
산출:
01:00:00
빼기 대신 모듈러스 나누기를 사용하여 위의 코드를 크게 단순화 할 수 있음을 깨달았습니다.
String hms = String.format("%02d:%02d:%02d", TimeUnit.MILLISECONDS.toHours(millis),
TimeUnit.MILLISECONDS.toMinutes(millis) % TimeUnit.HOURS.toMinutes(1),
TimeUnit.MILLISECONDS.toSeconds(millis) % TimeUnit.MINUTES.toSeconds(1));
TimeUnit
모든 매직 값에 여전히 API를 사용하고 정확히 동일한 출력을 제공합니다.
답변
이를위한 일반적인 방법은 매우 간단합니다.
public static String convertSecondsToHMmSs(long seconds) {
long s = seconds % 60;
long m = (seconds / 60) % 60;
long h = (seconds / (60 * 60)) % 24;
return String.format("%d:%02d:%02d", h,m,s);
}
답변
아파치 커먼즈를 사용하는 경우 :
DurationFormatUtils.formatDuration(timeInMS, "HH:mm:ss,SSS");
답변
답변
// New date object from millis
Date date = new Date(millis);
// formattter
SimpleDateFormat formatter= new SimpleDateFormat("HH:mm:ss.SSS");
formatter.setTimeZone(TimeZone.getTimeZone("UTC"));
// Pass date object
String formatted = formatter.format(date );
답변
DateFormat df = new SimpleDateFormat("HH:mm:ss");
String formatted = df.format(aDateObject);
답변
4 가지 구현에 대한 테스트 결과
방대한 데이터를 위해 많은 형식을 지정해야한다면 최고의 성능이 필요했기 때문에 다음과 같은 놀라운 결과가 나왔습니다.
for (int i = 0; i <1000000; i ++) {FUNCTION_CALL}
기간 :
- 조합 포맷 : 196 밀리
- formatDuration : 272 밀리
- 아파치 포맷 : 754 millis
-
formatTime 단위 : 2216 밀리
public static String apacheFormat(long millis) throws ParseException { return DurationFormatUtils.formatDuration(millis, "HH:mm:ss"); } public static String formatTimeUnit(long millis) throws ParseException { String formatted = String.format( "%02d:%02d:%02d", TimeUnit.MILLISECONDS.toHours(millis), TimeUnit.MILLISECONDS.toMinutes(millis) - TimeUnit.HOURS.toMinutes(TimeUnit.MILLISECONDS.toHours(millis)), TimeUnit.MILLISECONDS.toSeconds(millis) - TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS.toMinutes(millis))); return formatted; } public static String formatDuration(final long millis) { long seconds = (millis / 1000) % 60; long minutes = (millis / (1000 * 60)) % 60; long hours = millis / (1000 * 60 * 60); StringBuilder b = new StringBuilder(); b.append(hours == 0 ? "00" : hours < 10 ? String.valueOf("0" + hours) : String.valueOf(hours)); b.append(":"); b.append(minutes == 0 ? "00" : minutes < 10 ? String.valueOf("0" + minutes) : String.valueOf(minutes)); b.append(":"); b.append(seconds == 0 ? "00" : seconds < 10 ? String.valueOf("0" + seconds) : String.valueOf(seconds)); return b.toString(); } public static String combinationFormatter(final long millis) { long seconds = TimeUnit.MILLISECONDS.toSeconds(millis) - TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS.toMinutes(millis)); long minutes = TimeUnit.MILLISECONDS.toMinutes(millis) - TimeUnit.HOURS.toMinutes(TimeUnit.MILLISECONDS.toHours(millis)); long hours = TimeUnit.MILLISECONDS.toHours(millis); StringBuilder b = new StringBuilder(); b.append(hours == 0 ? "00" : hours < 10 ? String.valueOf("0" + hours) : String.valueOf(hours)); b.append(":"); b.append(minutes == 0 ? "00" : minutes < 10 ? String.valueOf("0" + minutes) : String.valueOf(minutes)); b.append(":"); b.append(seconds == 0 ? "00" : seconds < 10 ? String.valueOf("0" + seconds) : String.valueOf(seconds)); return b.toString(); }