How to convert Milliseconds to “X mins, x seconds” in Java?

后端 未结 27 1720
夕颜
夕颜 2020-11-22 03:59

I want to record the time using System.currentTimeMillis() when a user begins something in my program. When he finishes, I will subtract the current Syste

相关标签:
27条回答
  • 2020-11-22 04:28

    Joda-Time

    Using Joda-Time:

    DateTime startTime = new DateTime();
    
    // do something
    
    DateTime endTime = new DateTime();
    Duration duration = new Duration(startTime, endTime);
    Period period = duration.toPeriod().normalizedStandard(PeriodType.time());
    System.out.println(PeriodFormat.getDefault().print(period));
    
    0 讨论(0)
  • 2020-11-22 04:29

    Shortest solution:

    Here's probably the shortest which also deals with time zones.

    System.out.printf("%tT", millis-TimeZone.getDefault().getRawOffset());
    

    Which outputs for example:

    00:18:32
    

    Explanation:

    %tT is the time formatted for the 24-hour clock as %tH:%tM:%tS.

    %tT also accepts longs as input, so no need to create a Date. printf() will simply print the time specified in milliseconds, but in the current time zone therefore we have to subtract the raw offset of the current time zone so that 0 milliseconds will be 0 hours and not the time offset value of the current time zone.

    Note #1: If you need the result as a String, you can get it like this:

    String t = String.format("%tT", millis-TimeZone.getDefault().getRawOffset());
    

    Note #2: This only gives correct result if millis is less than a day because the day part is not included in the output.

    0 讨论(0)
  • 2020-11-22 04:29

    If you know the time difference would be less than an hour, then you can use following code:

        Calendar c1 = Calendar.getInstance();
        Calendar c2 = Calendar.getInstance();
    
        c2.add(Calendar.MINUTE, 51);
    
        long diff = c2.getTimeInMillis() - c1.getTimeInMillis();
    
        c2.set(Calendar.MINUTE, 0);
        c2.set(Calendar.HOUR, 0);
        c2.set(Calendar.SECOND, 0);
    
        DateFormat df = new SimpleDateFormat("mm:ss");
        long diff1 = c2.getTimeInMillis() + diff;
        System.out.println(df.format(new Date(diff1)));
    

    It will result to: 51:00

    0 讨论(0)
  • 2020-11-22 04:31

    I modified @MyKuLLSKI 's answer and added plurlization support. I took out seconds because I didn't need them, though feel free to re-add it if you need it.

    public static String intervalToHumanReadableTime(int intervalMins) {
    
        if(intervalMins <= 0) {
            return "0";
        } else {
    
            long intervalMs = intervalMins * 60 * 1000;
    
            long days = TimeUnit.MILLISECONDS.toDays(intervalMs);
            intervalMs -= TimeUnit.DAYS.toMillis(days);
            long hours = TimeUnit.MILLISECONDS.toHours(intervalMs);
            intervalMs -= TimeUnit.HOURS.toMillis(hours);
            long minutes = TimeUnit.MILLISECONDS.toMinutes(intervalMs);
    
            StringBuilder sb = new StringBuilder(12);
    
            if (days >= 1) {
                sb.append(days).append(" day").append(pluralize(days)).append(", ");
            }
    
            if (hours >= 1) {
                sb.append(hours).append(" hour").append(pluralize(hours)).append(", ");
            }
    
            if (minutes >= 1) {
                sb.append(minutes).append(" minute").append(pluralize(minutes));
            } else {
                sb.delete(sb.length()-2, sb.length()-1);
            }
    
            return(sb.toString());          
    
        }
    
    }
    
    public static String pluralize(long val) {
        return (Math.round(val) > 1 ? "s" : "");
    }
    
    0 讨论(0)
  • 2020-11-22 04:32

    Uhm... how many milliseconds are in a second? And in a minute? Division is not that hard.

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

    Continue like that for hours, days, weeks, months, year, decades, whatever.

    0 讨论(0)
  • 2020-11-22 04:34

    Just to add more info if you want to format like: HH:mm:ss

    0 <= HH <= infinite

    0 <= mm < 60

    0 <= ss < 60

    use this:

    int h = (int) ((startTimeInMillis / 1000) / 3600);
    int m = (int) (((startTimeInMillis / 1000) / 60) % 60);
    int s = (int) ((startTimeInMillis / 1000) % 60);
    

    I just had this issue now and figured this out

    0 讨论(0)
提交回复
热议问题