2010-05-29 7 views

Répondre

1

Avec l'API Java SE 6 basique, votre meilleur pari est le java.util.Calendar. Il est également disponible en Java ME. Il ne va pas falloir beaucoup de code pour calculer correctement le temps écoulé puisqu'il n'y a pas d'infrastructure intégrée pour calculer la période. Vous devez cloner l'instance de calendrier et ajouter les années, les mois et les jours dans une boucle de comptage jusqu'à ce qu'elle ait atteint la date de fin. Vous ne pouvez pas simplement diviser par secondes, parce que cela ne prendrait pas en compte les années bissextiles, les économies de jour et ce genre de choses. Après avoir calculé cela, vous pouvez diviser le reste en heures, minutes et secondes comme d'habitude.

Voici un exemple de coup d'envoi:

package com.stackoverflow.q2936686; 

import java.util.Calendar; 

public class ElapsedTimeWithCalendar { 

    public static void main(String[] args) throws Exception { 
     Calendar birthDate = Calendar.getInstance(); 
     birthDate.set(1978, 3 - 1, 26, 12, 35, 0); // My birthdate. 
     Calendar now = Calendar.getInstance(); // Now. 

     Integer[] elapsed = new Integer[6]; 
     Calendar clone = (Calendar) birthDate.clone(); // Otherwise changes are been reflected. 
     elapsed[0] = elapsed(clone, now, Calendar.YEAR); 
     clone.add(Calendar.YEAR, elapsed[0]); 
     elapsed[1] = elapsed(clone, now, Calendar.MONTH); 
     clone.add(Calendar.MONTH, elapsed[1]); 
     elapsed[2] = elapsed(clone, now, Calendar.DATE); 
     clone.add(Calendar.DATE, elapsed[2]); 
     elapsed[3] = (int) (now.getTimeInMillis() - clone.getTimeInMillis())/3600000; 
     clone.add(Calendar.HOUR, elapsed[3]); 
     elapsed[4] = (int) (now.getTimeInMillis() - clone.getTimeInMillis())/60000; 
     clone.add(Calendar.MINUTE, elapsed[4]); 
     elapsed[5] = (int) (now.getTimeInMillis() - clone.getTimeInMillis())/1000; 

     System.out.format("%d years, %d months, %d days, %d hours, %d minutes, %d seconds%n", elapsed); 
    } 

    private static int elapsed(Calendar before, Calendar after, int field) { 
     Calendar clone = (Calendar) before.clone(); // Otherwise changes are been reflected. 
     int elapsed = -1; 
     while (!clone.after(after)) { 
      clone.add(field, 1); 
      elapsed++; 
     } 
     return elapsed; 
    } 

} 

assez bavard, oui. Cependant, dans Java SE 7, une nouvelle API Date et heure (JSR-310) sera disponible, qui sera similaire à la version actuellement disponible JodaTime API. Voici un exemple de démarrage à l'aide de JodaTime:

DateTime birthDate = new DateTime(1978, 3, 26, 12, 35, 0, 0); 
DateTime now = new DateTime(); 
Period elapsed = new Period(birthDate, now); 

PeriodFormatter formatter = new PeriodFormatterBuilder() 
    .appendYears().appendSuffix(" years, ") 
    .appendMonths().appendSuffix(" months, ") 
    .appendDays().appendSuffix(" days, ") 
    .appendHours().appendSuffix(" hours, ") 
    .appendMinutes().appendSuffix(" minutes, ") 
    .appendSeconds().appendSuffix(" seconds") 
    .toFormatter(); 

System.out.println(formatter.print(elapsed)); 

Quelle différence, hein? :)