630 votes

Comment faire pour convertir quelques Millisecondes à "X minutes, les x secondes" en Java?

Je veux enregistrer le temps à l'aide d' System.currentTimeMillis() quand un utilisateur commence quelque chose dans mon programme. Quand il a terminé, je vais soustraire le courant System.currentTimeMillis() de la start variable, et je veux leur montrer que le temps écoulé à l'aide d'un format lisible par l'homme comme "XX heures XX minutes, XX secondes" ou même "XX minutes, XX secondes", parce que sa susceptible de ne pas prendre quelqu'un en une heure.

Quelle est la meilleure façon de le faire?

1328voto

siddhadev Points 6083

Depuis 1.5 il est le java.util.de façon concomitante.TimeUnit de la classe, de l'utiliser comme ceci:

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

Pour les versions de Java en dessous de 1.5 ou pour les systèmes qui ne supportent pas complètement l' TimeUnit de la classe (comme Android avant la version de l'API 9), les équations suivantes peuvent être utilisées:

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

//etc...

136voto

Brent Nash Points 6337

@Siddhadev réponse, j'ai écrit une fonction pour le faire récemment. Juste pensé que je pourrais partager avec vous au cas où quelqu'un le trouve utile:

   /**
     * 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());
    }

Profitez-en!

93voto

Damien Points 399
long time = 1536259;
//...
return (new SimpleDateFormat("mm:ss:SSS")).format(new Date(time));<br>

==> 25:36:259

36voto

Bombe Points 34185

Euh... combien de millisecondes sont dans un deuxième? Et en une minute? La Division n'est pas difficile.

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

Continuer comme ça pendant des heures, des jours, des semaines, des mois, des ans, des décennies, que ce soit.

28voto

cadrian Points 4102

Soit à la main divisions, ou de l'utilisation de la 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 par Bombe: Il a été démontré dans les commentaires que cette approche ne fonctionne que pour les petites durées (c'est à dire moins d'une journée).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X