46 votes

Calculer le temps écoulé en Java / Groovy

J'ai...


Date start = new Date()

...
...
...

Date stop = new Date()

Je voudrais avoir les années, mois, jours, heures, minutes et secondes ellapsed entre ces deux dates.

--

Je vais affiner la question.

Je veux juste passer le temps écoulé, comme une mesure absolue, c'est sans prendre en compte les années bissextiles, les jours de chaque mois, etc.

Donc je pense qu'il est impossible d'obtenir les années et les mois écoulé, tout ce que je peux obtenir est des jours, des heures, des minutes et des secondes.

Plus précisément, je veux dire que d'une certaine tâche a duré p. ex.

20 sec
13 min, 4 sec
2 h, 10 min, 2 sec
4 d, 4 h, 2 min, 2 sec

Donc, s'il vous plaît pardonnez mon manque de précision.

108voto

pd. Points 421

Je viens de découvrir cette solution rapide basée sur Groovy:

 TimeDuration td = TimeCategory.minus( stop, start )
println td
 

27voto

Sebastian Celis Points 7284

Vous pouvez faire tout cela avec division et mod.

 long l1 = start.getTime();
long l2 = stop.getTime();
long diff = l2 - l1;

long secondInMillis = 1000;
long minuteInMillis = secondInMillis * 60;
long hourInMillis = minuteInMillis * 60;
long dayInMillis = hourInMillis * 24;

long elapsedDays = diff / dayInMillis;
diff = diff % dayInMillis;
long elapsedHours = diff / hourInMillis;
diff = diff % hourInMillis;
long elapsedMinutes = diff / minuteInMillis;
diff = diff % minuteInMillis;
long elapsedSeconds = diff / secondInMillis;
 

Cela devrait vous donner toutes les informations que vous avez demandées.

EDIT: Étant donné que les gens semblent confus, non, cela ne prend pas en compte des choses telles que les années bissextiles ou les changements d’heure. C'est du temps écoulé pur, et c'est ce que demande openas.

19voto

toolkit Points 27248

Pas si facile avec l'API Date standard.

Vous voudrez peut -être plutôt regarder Joda Time ou JSR-310 .

Je ne suis pas un expert en Joda, mais je pense que le code serait:

 Interval interval = new Interval(d1.getTime(), d2.getTime());
Period period = interval.toPeriod();
System.out.printf(
    "%d years, %d months, %d days, %d hours, %d minutes, %d seconds%n", 
    period.getYears(), period.getMonths(), period.getDays(),
    period.getHours(), period.getMinutes(), period.getSeconds());
 

10voto

Fletch Points 1497

En ce qui concerne JodaTime, je viens de commencer; merci au répondant qui l’a suggéré. Voici une version plus condensée du code Joda suggérée:

 Period period = new Period(d1.getTime(), d2.getTime());
System.out.printf(
    "%d years, %d months, %d days, %d hours, %d minutes, %d seconds%n", 
    period.getYears(), period.getMonths(), period.getDays(),
    period.getHours(), period.getMinutes(), period.getSeconds());
 

(Je ne sais pas si cela aide la question initiale mais certainement les chercheurs).

6voto

dhesse Points 457

Depuis Java 1.5, vous devriez utiliser TimeUnit.

Voici un exemple simple et clair pour cela. Je pense qu'en groovy, il pourrait être plus court (comme toujours).

 /**
 * Formats a given {@link Date} to display a since-then timespan.
 * @param created
 * @return String with a format like "3 minutes ago"
 */
public static String getElapsedTime(Date created) {
    long duration = System.currentTimeMillis() - created.getTime();
    long seconds = TimeUnit.MILLISECONDS.toSeconds(duration);
    long days = TimeUnit.MILLISECONDS.toDays(duration);
    long hours = TimeUnit.MILLISECONDS.toHours(duration);
    long minutes = TimeUnit.MILLISECONDS.toMinutes(duration);
    if (days > 0) {
        return days + " days";
    }
    if (hours > 0) {
        return hours + " hrs";
    }
    if (minutes > 0) {
        return minutes + " minutes";
    }

    return seconds + " seconds";
}
 

Oh et éviter les retours multiples s'il vous plaît;)

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