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))
);
참고 : TimeUnit
Java 1.5 사양의 일부이지만 toMinutes
Java 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에 의해 편집 :이 접근법은 작은 기간 (즉, 하루 미만) 동안 만 작동한다는 의견에 표시되었습니다.