146 votes

Comment calculer le "temps écoulé" en Java ?

En Ruby on Rails, il y a une fonctionnalité qui vous permet de prendre n'importe quelle date et d'afficher combien de temps s'est écoulé depuis.

Par exemple:

Il y a 8 minutes
Il y a 8 heures
Il y a 8 jours
Il y a 8 mois
Il y a 8 ans

Y a-t-il un moyen facile de faire cela en Java?

1 votes

Voir : stackoverflow.com/questions/11/how-do-i-calculate-relative-t‌ime C'est en C#, mais je suis sûr que vous pouvez le convertir sans problème.

191voto

ataylor Points 31154

Jetez un œil à la bibliothèque PrettyTime.

C'est assez simple à utiliser :

import org.ocpsoft.prettytime.PrettyTime;

PrettyTime p = new PrettyTime();
System.out.println(p.format(new Date()));
// imprime "Il y a quelques instants"

Vous pouvez également passer une locale pour des messages internationalisés :

PrettyTime p = new PrettyTime(new Locale("fr"));
System.out.println(p.format(new Date()));
// imprime "à l'instant"

Comme indiqué dans les commentaires, Android a cette fonctionnalité intégrée dans la classe android.text.format.DateUtils.

241 votes

Au cas où vous travaillez sur Android, vous pouvez utiliser ceci : android.text.format.DateUtils#getRelativeTimeSpanString()

0 votes

Pouvez-vous s'il vous plaît ajouter plus de description à votre réponse, une réponse qui se contente d'un lien n'est pas satisfaisante pour le moment.

0 votes

@Somatik si vous avez besoin d'obtenir ceci sur une plate-forme non-Android, vous pouvez voir cette classe sur AOSP.

73voto

Ben J Points 2360

Avez-vous envisagé l'énumération TimeUnit ? Cela peut être très utile pour ce genre de chose

    try {
        SimpleDateFormat format = new SimpleDateFormat("dd/MM/yyyy");
        Date past = format.parse("01/10/2010");
        Date now = new Date();

        System.out.println(TimeUnit.MILLISECONDS.toMillis(now.getTime() - past.getTime()) + " il y a quelques millisecondes");
        System.out.println(TimeUnit.MILLISECONDS.toMinutes(now.getTime() - past.getTime()) + " il y a quelques minutes");
        System.out.println(TimeUnit.MILLISECONDS.toHours(now.getTime() - past.getTime()) + " il y a quelques heures");
        System.out.println(TimeUnit.MILLISECONDS.toDays(now.getTime() - past.getTime()) + " il y a quelques jours");
    }
    catch (Exception j){
        j.printStackTrace();
    }

4 votes

Je ne pense pas que ce soit une réponse complète car les unités de temps sont indépendantes. Par exemple - le temps en millisecondes est simplement le temps en minutes * 60 * 1000. Vous devez soustraire de chaque unité de temps l'unité de temps plus grande suivante (après l'avoir convertie en l'unité de temps inférieure) afin de pouvoir l'utiliser dans une chaîne "il y a quelques temps".

0 votes

@Benj - Est-ce correct ? La solution ci-dessus ? car une fois est au format 12 heures et une autre fois est au format 24 heures. Faites-moi savoir vos commentaires pour ma requête. Merci à l'avance.

0 votes

C'est incorrect même si... chaque unité est indépendante comme déjà mentionné.

59voto

Riccardo Casatta Points 163

Je prends les réponses de RealHowTo et Ben J et je crée ma propre version :

public class TimeAgo {
public static final List temps = Arrays.asList(
        TimeUnit.DAYS.toMillis(365),
        TimeUnit.DAYS.toMillis(30),
        TimeUnit.DAYS.toMillis(1),
        TimeUnit.HOURS.toMillis(1),
        TimeUnit.MINUTES.toMillis(1),
        TimeUnit.SECONDS.toMillis(1) );
public static final List tempsString = Arrays.asList("année","mois","jour","heure","minute","seconde");

public static String toDuration(long durée) {

    StringBuffer res = new StringBuffer();
    for(int i=0;i< TimeAgo.temps.size(); i++) {
        Long actuel = TimeAgo.temps.get(i);
        long temp = durée/actuel;
        if(temp>0) {
            res.append(temp).append(" ").append( TimeAgo.tempsString.get(i) ).append(temp != 1 ? "s" : "").append(" auparavant");
            break;
        }
    }
    if("".equals(res.toString()))
        return "0 seconde auparavant";
    else
        return res.toString();
}
public static void main(String args[]) {
    System.out.println(toDuration(123));
    System.out.println(toDuration(1230));
    System.out.println(toDuration(12300));
    System.out.println(toDuration(123000));
    System.out.println(toDuration(1230000));
    System.out.println(toDuration(12300000));
    System.out.println(toDuration(123000000));
    System.out.println(toDuration(1230000000));
    System.out.println(toDuration(12300000000L));
    System.out.println(toDuration(123000000000L));
}}

qui affichera le suivant

0 seconde auparavant
1 seconde auparavant
12 seconds ago
2 minutes ago
20 minutes ago
3 heures auparavant
1 jour avant
14 jours auparavant
4 mois auparavant
3 ans auparavant

0 votes

Vraiment cool. Et il est vraiment facile d'ajouter d'autres unités de temps comme la semaine(s)

1 votes

Celui-ci mérite plus de votes positifs. Tout d'abord, aucune bibliothèque n'est nécessaire. C'est toujours propre, élégant et facile à modifier.

0 votes

Petite coquille : dans votre code, vous faites référence aux propriétés statiques "Lists" au lieu de "TimeAgo". Lists.times.get(i) devrait être TimeAgo.get(i)... et ainsi de suite

45voto

RealHowTo Points 13117
public class TimeUtils {

      public final static long ONE_SECOND = 1000;
      public final static long SECONDS = 60;

      public final static long ONE_MINUTE = ONE_SECOND * 60;
      public final static long MINUTES = 60;

      public final static long ONE_HOUR = ONE_MINUTE * 60;
      public final static long HOURS = 24;

      public final static long ONE_DAY = ONE_HOUR * 24;

      private TimeUtils() {
      }

      /**
       * convertit le temps (en millisecondes) au format lisible par l'homme
       *  " jours,  heures,  minutes et (z) secondes"
       */
      public static String millisToLongDHMS(long duration) {
        StringBuilder res = new StringBuilder();
        long temp = 0;
        if (duration >= ONE_SECOND) {
          temp = duration / ONE_DAY;
          if (temp > 0) {
            duration -= temp * ONE_DAY;
            res.append(temp).append(" jour").append(temp > 1 ? "s" : "")
               .append(duration >= ONE_MINUTE ? ", " : "");
          }

          temp = duration / ONE_HOUR;
          if (temp > 0) {
            duration -= temp * ONE_HOUR;
            res.append(temp).append(" heure").append(temp > 1 ? "s" : "")
               .append(duration >= ONE_MINUTE ? ", " : "");
          }

          temp = duration / ONE_MINUTE;
          if (temp > 0) {
            duration -= temp * ONE_MINUTE;
            res.append(temp).append(" minute").append(temp > 1 ? "s" : "");
          }

          if (!res.toString().equals("") && duration >= ONE_SECOND) {
            res.append(" et ");
          }

          temp = duration / ONE_SECOND;
          if (temp > 0) {
            res.append(temp).append(" seconde").append(temp > 1 ? "s" : "");
          }
          return res.toString();
        } else {
          return "0 seconde";
        }
      }

      public static void main(String args[]) {
        System.out.println(millisToLongDHMS(123));
        System.out.println(millisToLongDHMS((5 * ONE_SECOND) + 123));
        System.out.println(millisToLongDHMS(ONE_DAY + ONE_HOUR));
        System.out.println(millisToLongDHMS(ONE_DAY + 2 * ONE_SECOND));
        System.out.println(millisToLongDHMS(ONE_DAY + ONE_HOUR + (2 * ONE_MINUTE)));
        System.out.println(millisToLongDHMS((4 * ONE_DAY) + (3 * ONE_HOUR)
            + (2 * ONE_MINUTE) + ONE_SECOND));
        System.out.println(millisToLongDHMS((5 * ONE_DAY) + (4 * ONE_HOUR)
            + ONE_MINUTE + (23 * ONE_SECOND) + 123));
        System.out.println(millisToLongDHMS(42 * ONE_DAY));
        /*
          output :
                0 seconde
                5 secondes
                1 jour, 1 heure
                1 jour et 2 secondes
                1 jour, 1 heure, 2 minutes
                4 jours, 3 heures, 2 minutes et 1 seconde
                5 jours, 4 heures, 1 minute et 23 secondes
                42 jours
         */
    }
}

0 votes

J'ai fini par utiliser une version révisée de ceci. J'ai posté mes révisions pour toi.

5 votes

David Blevins, plus d'exemples sur PrettyTime : stackoverflow.com/questions/3859288/… Gros -1 pour réinventer la roue une fois de plus et ne pas recommander une bibliothèque tierce :-p

10voto

Moria Points 71

Il y a un moyen simple de faire cela :

Disons que vous voulez le temps il y a 20 minutes :

Long minutesAgo = new Long(20);
Date date = new Date();
Date dateIn_X_MinAgo = new Date (date.getTime() - minutesAgo*60*1000);

c'est tout..

2 votes

Dans la plupart des cas, vous voulez un affichage "intelligent", c'est-à-dire au lieu de 5125 minutes plus tôt, vous indiquez x jours plus tô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