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

后端 未结 27 1836
夕颜
夕颜 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:15

    Either hand divisions, or use the 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: It has been shown in the comments that this approach only works for smaller durations (i.e. less than a day).

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

    for correct strings ("1hour, 3sec", "3 min" but not "0 hour, 0 min, 3 sec") i write this code:

    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";
    
    0 讨论(0)
  • 2020-11-22 04:16

    I have covered this in another answer but you can do:

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

    The output is something like Map:{DAYS=1, HOURS=3, MINUTES=46, SECONDS=40, MILLISECONDS=0, MICROSECONDS=0, NANOSECONDS=0}, with the units ordered.

    It's up to you to figure out how to internationalize this data according to the target locale.

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

    I think the best way is:

    String.format("%d min, %d sec", 
        TimeUnit.MILLISECONDS.toSeconds(length)/60,
        TimeUnit.MILLISECONDS.toSeconds(length) % 60 );
    
    0 讨论(0)
  • 2020-11-22 04:19

    Revisiting @brent-nash contribution, we could use modulus function instead of subtractions and use String.format method for the result string:

      /**
       * 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);
       }
    
    0 讨论(0)
  • 2020-11-22 04:20

    DurationFormatUtils.formatDurationHMS(long)

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