Difference de date

Résolu/Fermé
Utilisateur anonyme - 23 avril 2008 à 17:21
 Siiimooon - 13 déc. 2010 à 11:06
Bonjour,

Juste une question, est-ce qu'une méthode déjà fournie en Java pourrait me donner la différence entre deux dates, non pas en jours (ça je sais le faire) mais précisément sous cette forme :

3 années, 1 mois, 5 jours, 14 heures...

C'est pour une petite animation pour un site.

J'ai vu la classe GregorianCalendar mais je trouve lourd pour calculer ça, il faut ajuster pour voir s'il n'y a pas de dépassement dans les mois (dans ce cas on a des valeurs négatives...)... Je sais comment m'y prendre, juste pour lancer un peu une discussion, sur une méthode SIMPLE et PRECISE.

9 réponses

kij_82 Messages postés 4088 Date d'inscription jeudi 7 avril 2005 Statut Contributeur Dernière intervention 30 septembre 2013 857
23 avril 2008 à 17:34
Bonjour,

Tu peux récupèrer tes dates sous forme de timestamp (millisecondes écoulées), soustraire l'un à l'autre pour avoir la différence et créer un objet Time (ca doit exister) qui te permet de formater ton temps en millisecondes en chaine de caractères avec les années, mois, jours, etc.
1
Utilisateur anonyme
23 avril 2008 à 17:37
Voici la méthode que j'ai trouvé, ça marche, c'était pour voir si on peut faire un peu plus simple :

   GregorianCalendar aujourdhui = new GregorianCalendar(2008,4,22,0,0,0); // 22 mai 2008
   GregorianCalendar apres = new GregorianCalendar(2009,0,1,0,0,0); // 1 janvier 2009

   int ans  = apres.get(Calendar.YEAR)-aujourdhui.get(Calendar.YEAR);
   boolean ajusteAnnee=false;
   aujourdhui.add(Calendar.YEAR, ans);
   if(aujourdhui.after(apres))
   {
   ajusteAnnee=true;
   aujourdhui.add(Calendar.YEAR, -1);
   ans--;
   }

   int mois = apres.get(Calendar.MONTH)-aujourdhui.get(Calendar.MONTH);
   if(ajusteAnnee && mois<=0)
    mois+=11;

   aujourdhui.add(Calendar.MONTH, mois);
   if(aujourdhui.after(apres))
   {
    aujourdhui.add(Calendar.MONTH, -1);
    mois-=1;
   }

   int jours =apres.get(Calendar.DAY_OF_YEAR)-aujourdhui.get(Calendar.DAY_OF_YEAR);
   if(jours<0)
    jours+=365;

   System.out.println(ans  + " annees.");
   System.out.println(mois + " mois.");
   System.out.println(jours + " jours.");
1
kij_82 Messages postés 4088 Date d'inscription jeudi 7 avril 2005 Statut Contributeur Dernière intervention 30 septembre 2013 857
23 avril 2008 à 17:46
Tu peux faire aussi comme cela :

		GregorianCalendar aujourdhui = new GregorianCalendar(2008,4,22,0,0,0); // 22 mai 2008
		GregorianCalendar apres = new GregorianCalendar(2009,0,1,0,0,0); // 1 janvier 2009
		
		long aTime = aujourdhui.getTimeInMillis();
		long bTime = apres.getTimeInMillis();
		
		long dif = bTime - aTime;
		Timestamp myTimer = new Timestamp(dif);
		myTimer.getYear() ...


Et si tu ne veux plus utiliser t'objet gregorianCalendar tu peux toujours utiliser un objet Date ou équivalent.


EDIT : apparemment non ca ne fonctionne pas. Timestamp permet de définir une date et non une durée écoulée.
Ce que tu peux faire c'est une fois la différence récupérer, tu module le nombre d'année en faisant un modulo (opérateur %) par rapport au nombre de secondes dans une années, pour avoir le nombre de mois, tu prends le reste de ce modulo et tu le module à nouveau par le nombre de secondes dans un mois, et ainsi de suite..
0
Utilisateur anonyme
23 avril 2008 à 17:55
Ce code


   GregorianCalendar aujourdhui = new GregorianCalendar(2008,4,22,0,0,0); // 22 mai 2008
   GregorianCalendar apres = new GregorianCalendar(2009,0,1,0,0,0); // 1 janvier 2009
		
   long aTime = aujourdhui.getTimeInMillis();
   long bTime = apres.getTimeInMillis();
		
   long dif = bTime - aTime;
   Timestamp myTimer = new Timestamp(dif);
   int ans = myTimer.getYear();
   int mois = myTimer.getMonth();
   int jours = myTimer.getDay();

   System.out.println(ans  + " annees.");
   System.out.println(mois + " mois.");
   System.out.println(jours + " jours.");


me donne :

70 années
7 mois
4 jours

Je crois qu'il y a une m**** quelque part LOL

:-(
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Utilisateur anonyme
23 avril 2008 à 17:58
Quant à la solution des modulos, d'accord mais les mois n'ont pas tous le même nombre de secondes, il faudra alors gérer. Il y a bien plusieurs méthodes, celle que j'ai semble fonctionner, seulement voilà, je suis de ceux qui aiment aussi optimiser le code pour le rendre plus propre.
0
kij_82 Messages postés 4088 Date d'inscription jeudi 7 avril 2005 Statut Contributeur Dernière intervention 30 septembre 2013 857
23 avril 2008 à 18:00
Erf, effectivement j'ai pas pensé aux mois :s
Si tu trouve un objet Time qui te donne ces temps tu pourra alors utiliser ce que j'ai mis plus haut, mais même avec ça, j'imagine que cet objet fera la même chose que toi, à savoir gérer les différences pour les mois, etc.
0
Utilisateur anonyme
23 avril 2008 à 18:05
Bon ben faute de mieux, je mets donc en résolu, merci quand même, ça m'a donné une idée en tout cas...

A+
0
Bonjour,

vous pouvez utiliser ça aussi comme une requete postgres, elle retourne un resultat sous forme x Year, y month z days
select age(current_date, datequelconque)
from nom_table;
0
Salut à tous,

Voici mon code pour calculer l'age de quelqu'un au jour près :

// On définit la date d'aujourd'hui :
GregorianCalendar dateDuJour = new GregorianCalendar();
dateDuJour.setTime(new Date());

// On définit la date de naissance :
GregorianCalendar dateNaissance = new GregorianCalendar(1984,7,4,0,0,0);
// Attention les mois commence à 0 (janvier = 0, fev = 1,...)

// On fait la différence en millisecondes :
Long diff = dateDuJour.getTimeInMillis() - dateNaissance.getTimeInMillis();

// On passe la différence en Calendar :
GregorianCalendar difference = new GregorianCalendar();
difference.setTimeInMillis(diff);

// Le timestamp commençant le 1 janvier 1970, on enlève 1970 à l'année obtenue
int year = difference.get(Calendar.YEAR) - 1970;
int month = difference.get(Calendar.MONTH);
int day = difference.get(Calendar.DAY_OF_MONTH);

// RESULTAT :
String age = year + " ans, " + month + " mois et " + day + " jours";
System.out.println(" Age : " + age);


Alors pour moi ça fonctionne, avec des anniversaire avant 1970 et après.

a+
0