[java] Java에서 밀리 초를 “X 분, x 초”로 변환하는 방법은 무엇입니까?

System.currentTimeMillis()사용자가 프로그램에서 무언가를 시작할 때 사용하는 시간을 기록하고 싶습니다 . 완료되면 변수 에서 전류 System.currentTimeMillis()를 빼고 start“XX 시간, XX 분, XX 초”또는 “XX 분, XX 초”와 같은 사람이 읽을 수있는 형식을 사용하여 경과 된 시간을 보여주고 싶습니다. 한 시간 동안 누군가를 데려 가지 않을 것입니다.

가장 좋은 방법은 무엇입니까?



답변

java.util.concurrent.TimeUnit수업 사용 :

String.format("%d min, %d sec",
    TimeUnit.MILLISECONDS.toMinutes(millis),
    TimeUnit.MILLISECONDS.toSeconds(millis) -
    TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS.toMinutes(millis))
);

참고 : TimeUnitJava 1.5 사양의 일부이지만 toMinutesJava 1.6부터 추가되었습니다.

값 0-9에 선행 0을 추가하려면 다음을 수행하십시오.

String.format("%02d min, %02d sec",
    TimeUnit.MILLISECONDS.toMinutes(millis),
    TimeUnit.MILLISECONDS.toSeconds(millis) -
    TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS.toMinutes(millis))
);

지원되지 TimeUnit않거나 toMinutes지원되지 않는 경우 (예 : API 버전 9 이전의 Android에서) 다음 방정식을 사용하십시오.

int seconds = (int) (milliseconds / 1000) % 60 ;
int minutes = (int) ((milliseconds / (1000*60)) % 60);
int hours   = (int) ((milliseconds / (1000*60*60)) % 24);
//etc...


답변

@siddhadev의 답변에 따라 밀리 초를 형식이 지정된 문자열로 변환하는 함수를 작성했습니다.

   /**
     * Convert a millisecond duration to a string format
     *
     * @param millis A duration to convert to a string form
     * @return A string of the form "X Days Y Hours Z Minutes A Seconds".
     */
    public static String getDurationBreakdown(long millis) {
        if(millis < 0) {
            throw new IllegalArgumentException("Duration must be greater than zero!");
        }

        long days = TimeUnit.MILLISECONDS.toDays(millis);
        millis -= TimeUnit.DAYS.toMillis(days);
        long hours = TimeUnit.MILLISECONDS.toHours(millis);
        millis -= TimeUnit.HOURS.toMillis(hours);
        long minutes = TimeUnit.MILLISECONDS.toMinutes(millis);
        millis -= TimeUnit.MINUTES.toMillis(minutes);
        long seconds = TimeUnit.MILLISECONDS.toSeconds(millis);

        StringBuilder sb = new StringBuilder(64);
        sb.append(days);
        sb.append(" Days ");
        sb.append(hours);
        sb.append(" Hours ");
        sb.append(minutes);
        sb.append(" Minutes ");
        sb.append(seconds);
        sb.append(" Seconds");

        return(sb.toString());
    }


답변

long time = 1536259;

return (new SimpleDateFormat("mm:ss:SSS")).format(new Date(time));

인쇄물:

25 : 36 : 259


답변

음 … 1 초에 몇 밀리 초입니까? 그리고 잠시 후에? 사단은 그렇게 어렵지 않습니다.

int seconds = (int) ((milliseconds / 1000) % 60);
int minutes = (int) ((milliseconds / 1000) / 60);

시간, 일, 주, 월, 년, 수십 년 동안 계속하십시오.


답변

Java 8에서 java.time 패키지 사용 :

Instant start = Instant.now();
Thread.sleep(63553);
Instant end = Instant.now();
System.out.println(Duration.between(start, end));

출력에 ISO 8601 시간 형식 : PT1M3.553S(1 분 3.553 초).


답변

나는 그것을 위해 여분의 의존성을 끌어 들이지 않을 것입니다 (결국 전혀 어렵지 않습니다). 그러나 Commons Lang을 사용하고 있다면 DurationFormatUtils가 있습니다. 있습니다.

사용 예 ( 여기 에서 적응 ) :

import org.apache.commons.lang3.time.DurationFormatUtils

public String getAge(long value) {
    long currentTime = System.currentTimeMillis();
    long age = currentTime - value;
    String ageString = DurationFormatUtils.formatDuration(age, "d") + "d";
    if ("0d".equals(ageString)) {
        ageString = DurationFormatUtils.formatDuration(age, "H") + "h";
        if ("0h".equals(ageString)) {
            ageString = DurationFormatUtils.formatDuration(age, "m") + "m";
            if ("0m".equals(ageString)) {
                ageString = DurationFormatUtils.formatDuration(age, "s") + "s";
                if ("0s".equals(ageString)) {
                    ageString = age + "ms";
                }
            }
        }
    }
    return ageString;
}   

예:

long lastTime = System.currentTimeMillis() - 2000;
System.out.println("Elapsed time: " + getAge(lastTime));

//Output: 2s

참고 : 두 개의 LocalDateTime 객체에서 밀리를 얻으려면 다음을 사용할 수 있습니다.

long age = ChronoUnit.MILLIS.between(initTime, LocalDateTime.now())


답변

손으로 나누거나 SimpleDateFormat API를 사용하십시오 .

long start = System.currentTimeMillis();
// do your work...
long elapsed = System.currentTimeMillis() - start;
DateFormat df = new SimpleDateFormat("HH 'hours', mm 'mins,' ss 'seconds'");
df.setTimeZone(TimeZone.getTimeZone("GMT+0"));
System.out.println(df.format(new Date(elapsed)));

Bombe에 의해 편집 :이 접근법은 작은 기간 (즉, 하루 미만) 동안 만 작동한다는 의견에 표시되었습니다.