[java] 밀리 초를“hh : mm : ss”형식으로 변환하는 방법은 무엇입니까?

혼란 스러워요. 스레드를 우연히 만난 후 형식이있는 카운트 다운 타이머를 형식화하는 방법을 알아 내려고했습니다 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, 나는 당신의 TimeUnitAPI 사용을 좋아합니다 🙂

테스트 코드는 다음과 같습니다.

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");


답변

나는 이것을 사용했다 :

String.format("%1$tH:%1$tM:%1$tS.%1$tL", millis);

Formatter 클래스의 설명을 참조하십시오 .

2400ms의 입력을 사용하여 실행 가능한 예제 를 참조하십시오 .


답변

// 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 );

1200ms의 입력을 사용하여 실행 가능한 예제 를 참조하십시오 .


답변

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