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에 의해 편집 :이 접근법은 작은 기간 (즉, 하루 미만) 동안 만 작동한다는 의견에 표시되었습니다.
