首页 文章

如何在Java中将毫秒转换为“X分钟,x秒”?

提问于
浏览
508

当用户在我的程序中开始某些操作时,我想使用 System.currentTimeMillis() 记录时间 . 当他完成时,我将从 start 变量中减去当前的 System.currentTimeMillis() ,并且我想向他们展示使用人类可读格式(例如"XX hours, XX mins, XX seconds"或甚至"XX mins, XX seconds")所经过的时间,因为它不可能花费一个小时的时间 .

最好的方法是什么?

25 回答

  • 24

    这是基于布伦特纳什答案的答案,希望有所帮助!

    public static String getDurationBreakdown(long millis)
    {
        String[] units = {" Days ", " Hours ", " Minutes ", " Seconds "};
        Long[] values = new Long[units.length];
        if(millis < 0)
        {
            throw new IllegalArgumentException("Duration must be greater than zero!");
        }
    
        values[0] = TimeUnit.MILLISECONDS.toDays(millis);
        millis -= TimeUnit.DAYS.toMillis(values[0]);
        values[1] = TimeUnit.MILLISECONDS.toHours(millis);
        millis -= TimeUnit.HOURS.toMillis(values[1]);
        values[2] = TimeUnit.MILLISECONDS.toMinutes(millis);
        millis -= TimeUnit.MINUTES.toMillis(values[2]);
        values[3] = TimeUnit.MILLISECONDS.toSeconds(millis);
    
        StringBuilder sb = new StringBuilder(64);
        boolean startPrinting = false;
        for(int i = 0; i < units.length; i++){
            if( !startPrinting && values[i] != 0)
                startPrinting = true;
            if(startPrinting){
                sb.append(values[i]);
                sb.append(units[i]);
            }
        }
    
        return(sb.toString());
    }
    
  • 1

    Joda-Time

    使用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));
    
  • 1

    嗯...一秒钟多少毫秒?一会儿?分工不是那么难 .

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

    像这样继续几小时,几天,几周,几个月,一年,几十年,等等 .

  • 62

    重新访问@ brent-nash贡献,我们可以使用模数函数而不是减法,并使用String.format方法作为结果字符串:

    /**
       * 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 B Milliseconds".
       */
       public static String getDurationBreakdown(long millis) {
           if (millis < 0) {
              throw new IllegalArgumentException("Duration must be greater than zero!");
           }
    
           long days = TimeUnit.MILLISECONDS.toDays(millis);
           long hours = TimeUnit.MILLISECONDS.toHours(millis) % 24;
           long minutes = TimeUnit.MILLISECONDS.toMinutes(millis) % 60;
           long seconds = TimeUnit.MILLISECONDS.toSeconds(millis) % 60;
           long milliseconds = millis % 1000;
    
           return String.format("%d Days %d Hours %d Minutes %d Seconds %d Milliseconds",
                                days, hours, minutes, seconds, milliseconds);
       }
    
  • 2

    适用于API 9以下的Android

    (String.format("%d hr %d min, %d sec", millis/(1000*60*60), (millis%(1000*60*60))/(1000*60), ((millis%(1000*60*60))%(1000*60))/1000))
    
  • 1

    使用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规范的一部分,但是从Java 1.6开始添加了 toMinutes .

    要为值0-9添加前导零,只需执行以下操作:

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

    如果不支持 TimeUnittoMinutes (例如在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...
    
  • 5

    我不会仅仅为了那个拉出额外的依赖(毕竟分裂并不那么难),但是如果你还在使用Commons Lang,那么就有DurationFormatUtils .

  • 26

    如果您知道时差不到一小时,那么您可以使用以下代码:

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

    结果将是:51:00

  • 1

    只是为了添加更多信息,如果你想格式化如下:HH:mm:ss

    0 <= HH <=无穷大

    0 <= mm <60

    0 <= ss <60

    用这个:

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

    我现在才遇到这个问题,并想出了这个问题

  • 113

    手划分,或使用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)));
    

    Edit by Bombe :评论中显示,这种方法仅适用于较小的持续时间(即不到一天) .

  • 11

    这在Java 9中更容易:

    Duration elapsedTime = Duration.ofMillis(millisDiff );
        String humanReadableElapsedTime = String.format(
                "%d hours, %d mins, %d seconds",
                elapsedTime.toHours(),
                elapsedTime.toMinutesPart(),
                elapsedTime.toSecondsPart());
    

    这会产生类似 0 hours, 39 mins, 9 seconds 的字符串 .

    如果要在格式化之前舍入到整秒:

    elapsedTime = elapsedTime.plusMillis(500).truncatedTo(ChronoUnit.SECONDS);
    

    如果它们是0,则省略小时:

    long hours = elapsedTime.toHours();
        String humanReadableElapsedTime;
        if (hours == 0) {
            humanReadableElapsedTime = String.format(
                    "%d mins, %d seconds",
                    elapsedTime.toMinutesPart(),
                    elapsedTime.toSecondsPart());
    
        } else {
            humanReadableElapsedTime = String.format(
                    "%d hours, %d mins, %d seconds",
                    hours,
                    elapsedTime.toMinutesPart(),
                    elapsedTime.toSecondsPart());
        }
    

    现在我们可以举例如 39 mins, 9 seconds .

    要使用前导零打印分钟和秒以使它们始终为两位数,只需将 02 插入相关的格式说明符中,即:

    String humanReadableElapsedTime = String.format(
                "%d hours, %02d mins, %02d seconds",
                elapsedTime.toHours(),
                elapsedTime.toMinutesPart(),
                elapsedTime.toSecondsPart());
    

    现在我们可以举例如 0 hours, 39 mins, 09 seconds .

  • 4

    Shortest solution:

    这可能是最短的也涉及时区 .

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

    以哪些输出为例:

    00:18:32
    

    Explanation:

    %tT 是将24小时制格式化为 %tH:%tM:%tS 的时间 .

    %tT 也接受long作为输入,因此无需创建 Date . printf() 将只打印以毫秒为单位指定的时间,但在当前时区中,我们必须减去当前时区的原始偏移量,使0毫秒为0小时,而不是当前时区的时间偏移值 .

    Note #1: 如果您需要将结果作为 String ,您可以这样得到:

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

    Note #2: 如果 millis 小于一天,则仅提供正确的结果,因为日期部分未包含在输出中 .

  • 25

    我认为最好的方法是:

    String.format("%d min, %d sec", 
        TimeUnit.MILLISECONDS.toSeconds(length)/60,
        TimeUnit.MILLISECONDS.toSeconds(length) % 60 );
    
  • 1
    long startTime = System.currentTimeMillis();
        // do your work...
        long endTime=System.currentTimeMillis();
        long diff=endTime-startTime;       
        long hours=TimeUnit.MILLISECONDS.toHours(diff);
        diff=diff-(hours*60*60*1000);
        long min=TimeUnit.MILLISECONDS.toMinutes(diff);
        diff=diff-(min*60*1000);
        long seconds=TimeUnit.MILLISECONDS.toSeconds(diff);
        //hour, min and seconds variables contains the time elapsed on your work
    
  • 20
    long time = 1536259;
    
    return (new SimpleDateFormat("mm:ss:SSS")).format(new Date(time));
    

    打印:

    25:36:259

  • 34

    在Java 8中使用java.time package

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

    输出位于ISO 8601 Duration formatPT1M3.553S (1分3.553秒) .

  • 2

    这个答案类似于上面的一些答案 . 但是,我认为这将是有益的,因为与其他答案不同,这将删除任何额外的逗号或空格并处理缩写 .

    /**
     * Converts milliseconds to "x days, x hours, x mins, x secs"
     * 
     * @param millis
     *            The milliseconds
     * @param longFormat
     *            {@code true} to use "seconds" and "minutes" instead of "secs" and "mins"
     * @return A string representing how long in days/hours/minutes/seconds millis is.
     */
    public static String millisToString(long millis, boolean longFormat) {
        if (millis < 1000) {
            return String.format("0 %s", longFormat ? "seconds" : "secs");
        }
        String[] units = {
                "day", "hour", longFormat ? "minute" : "min", longFormat ? "second" : "sec"
        };
        long[] times = new long[4];
        times[0] = TimeUnit.DAYS.convert(millis, TimeUnit.MILLISECONDS);
        millis -= TimeUnit.MILLISECONDS.convert(times[0], TimeUnit.DAYS);
        times[1] = TimeUnit.HOURS.convert(millis, TimeUnit.MILLISECONDS);
        millis -= TimeUnit.MILLISECONDS.convert(times[1], TimeUnit.HOURS);
        times[2] = TimeUnit.MINUTES.convert(millis, TimeUnit.MILLISECONDS);
        millis -= TimeUnit.MILLISECONDS.convert(times[2], TimeUnit.MINUTES);
        times[3] = TimeUnit.SECONDS.convert(millis, TimeUnit.MILLISECONDS);
        StringBuilder s = new StringBuilder();
        for (int i = 0; i < 4; i++) {
            if (times[i] > 0) {
                s.append(String.format("%d %s%s, ", times[i], units[i], times[i] == 1 ? "" : "s"));
            }
        }
        return s.toString().substring(0, s.length() - 2);
    }
    
    /**
     * Converts milliseconds to "x days, x hours, x mins, x secs"
     * 
     * @param millis
     *            The milliseconds
     * @return A string representing how long in days/hours/mins/secs millis is.
     */
    public static String millisToString(long millis) {
        return millisToString(millis, false);
    }
    
  • 1

    我的简单计算:

    String millisecToTime(int millisec) {
        int sec = millisec/1000;
        int second = sec % 60;
        int minute = sec / 60;
        if (minute >= 60) {
            int hour = minute / 60;
            minute %= 60;
            return hour + ":" + (minute < 10 ? "0" + minute : minute) + ":" + (second < 10 ? "0" + second : second);
        }
        return minute + ":" + (second < 10 ? "0" + second : second);
    }
    

    快乐编码:)

  • 1113

    我已在另一个answer中介绍了这一点,但您可以这样做:

    public static Map<TimeUnit,Long> computeDiff(Date date1, Date date2) {
        long diffInMillies = date2.getTime() - date1.getTime();
        List<TimeUnit> units = new ArrayList<TimeUnit>(EnumSet.allOf(TimeUnit.class));
        Collections.reverse(units);
        Map<TimeUnit,Long> result = new LinkedHashMap<TimeUnit,Long>();
        long milliesRest = diffInMillies;
        for ( TimeUnit unit : units ) {
            long diff = unit.convert(milliesRest,TimeUnit.MILLISECONDS);
            long diffInMilliesForUnit = unit.toMillis(diff);
            milliesRest = milliesRest - diffInMilliesForUnit;
            result.put(unit,diff);
        }
        return result;
    }
    

    输出类似于 Map:{DAYS=1, HOURS=3, MINUTES=46, SECONDS=40, MILLISECONDS=0, MICROSECONDS=0, NANOSECONDS=0} ,单位已订购 .

    由您决定如何根据目标语言环境来国际化此数据 .

  • 12

    这儿存在一个问题 . 当毫秒为59999时,实际上它是1分钟,但它将被计算为59秒并且丢失999毫秒 .

    以下是基于之前答案的修改版本,可以解决此问题:

    public static String formatTime(long millis) {
        long seconds = Math.round((double) millis / 1000);
        long hours = TimeUnit.SECONDS.toHours(seconds);
        if (hours > 0)
            seconds -= TimeUnit.HOURS.toSeconds(hours);
        long minutes = seconds > 0 ? TimeUnit.SECONDS.toMinutes(seconds) : 0;
        if (minutes > 0)
            seconds -= TimeUnit.MINUTES.toSeconds(minutes);
        return hours > 0 ? String.format("%02d:%02d:%02d", hours, minutes, seconds) : String.format("%02d:%02d", minutes, seconds);
    }
    
  • 6

    根据@ 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());
        }
    
  • 0

    我修改了@MyKuLLSKI的答案并添加了plurlization支持 . 我花了几秒钟,因为我不需要它们,但如果你需要,可以随意重新添加它 .

    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" : "");
    }
    
  • 6

    对于不到一小时的小时间,我更喜欢:

    long millis = ...
    
    System.out.printf("%1$TM:%1$TS", millis);
    // or
    String str = String.format("%1$TM:%1$TS", millis);
    

    更长的intervalls:

    private static final long HOUR = TimeUnit.HOURS.toMillis(1);
    ...
    if (millis < HOUR) {
        System.out.printf("%1$TM:%1$TS%n", millis);
    } else {
        System.out.printf("%d:%2$TM:%2$TS%n", millis / HOUR, millis % HOUR);
    }
    
  • 3

    使用java.util.concurrent.TimeUnit,并使用这个简单的方法:

    private static long timeDiff(Date date, Date date2, TimeUnit unit) {
        long milliDiff=date2.getTime()-date.getTime();
        long unitDiff = unit.convert(milliDiff, TimeUnit.MILLISECONDS);
        return unitDiff; 
    }
    

    例如:

    SimpleDateFormat sdf = new SimpleDateFormat("yy/MM/dd HH:mm:ss");  
    Date firstDate = sdf.parse("06/24/2017 04:30:00");
    Date secondDate = sdf.parse("07/24/2017 05:00:15");
    Date thirdDate = sdf.parse("06/24/2017 06:00:15");
    
    System.out.println("days difference: "+timeDiff(firstDate,secondDate,TimeUnit.DAYS));
    System.out.println("hours difference: "+timeDiff(firstDate,thirdDate,TimeUnit.HOURS));
    System.out.println("minutes difference: "+timeDiff(firstDate,thirdDate,TimeUnit.MINUTES));
    System.out.println("seconds difference: "+timeDiff(firstDate,thirdDate,TimeUnit.SECONDS));
    
  • 3

    对于正确的字符串(“1小时,3秒”,“3分钟”但不是“0小时,0分钟,3秒”)我写这段代码:

    int seconds = (int)(millis / 1000) % 60 ;
    int minutes = (int)((millis / (1000*60)) % 60);
    int hours = (int)((millis / (1000*60*60)) % 24);
    int days = (int)((millis / (1000*60*60*24)) % 365);
    int years = (int)(millis / 1000*60*60*24*365);
    
    ArrayList<String> timeArray = new ArrayList<String>();
    
    if(years > 0)   
        timeArray.add(String.valueOf(years)   + "y");
    
    if(days > 0)    
        timeArray.add(String.valueOf(days) + "d");
    
    if(hours>0)   
        timeArray.add(String.valueOf(hours) + "h");
    
    if(minutes>0) 
        timeArray.add(String.valueOf(minutes) + "min");
    
    if(seconds>0) 
        timeArray.add(String.valueOf(seconds) + "sec");
    
    String time = "";
    for (int i = 0; i < timeArray.size(); i++) 
    {
        time = time + timeArray.get(i);
        if (i != timeArray.size() - 1)
            time = time + ", ";
    }
    
    if (time == "")
      time = "0 sec";
    

相关问题