Partage
  • Partager sur Facebook
  • Partager sur Twitter

Problème de calcul de différence entre 2 dates

    18 septembre 2020 à 10:30:20

    Bonjour tout le monde.

    Je viens vers vous aujourd’hui car je fais face à une colle de fou XD.

    Je voudrais calculer la différence entre 2 dates et ensuite la convertir en année/mois/jour/heure/minute/seconde.

    J'ai déjà ceci :

    long lNumberOfYears = ChronoUnit.YEARS.between(currentDate, expirationDate) % 100; // years
    long lNumberOfMonths = ChronoUnit.MONTHS.between(currentDate, expirationDate) % 12; // months
    
    long lNumberOfDays = ChronoUnit.DAYS.between(currentDate, expirationDate) % 30; // days
    
    long lNumberOfHours = ChronoUnit.HOURS.between(currentDate, expirationDate) % 24; // hours
    long lNumberOfMinutes = ChronoUnit.MINUTES.between(currentDate, expirationDate) % 60; // minutes
    long lNumberOfSeconds = ChronoUnit.SECONDS.between(currentDate, expirationDate) % 60; // seconds

    Mais le calcul de jour n'est pas bon puisque tous les mois de l'année n'ont pas 30 jours.

    En revanche, si j'enlève mon modulo 30. le nombre de jours est correct.

    L'idée serait peut-être de convertir les jours en jours/mois/année.

    Ou alors changer le calcul ?

    Pouvez-vous me venir en aide sur ce point s'il vous plait ?

    Merci d'avance.

    PS : Pour info avant j'ai tenté de faire le calcul est comptant le nombre de secondes entre les 2 dates

    long differenceInSecondsToSpecifiedTime = ChronoUnit.SECONDS.between(currentDate, expirationDate);
    
    long lNumberOfDays    = differenceInSecondsToSpecifiedTime / 60 / 60 / 24 % 365;
    long lNumberOfHours = differenceInSecondsToSpecifiedTime / 60 / 60 % 24; long lNumberOfMinutes = differenceInSecondsToSpecifiedTime / 60 % 60; long lNumberOfSeconds = differenceInSecondsToSpecifiedTime % 60;

    Sauf que sur ce calcul je n'avais pas besoin du nombre de mois et d'année

    -
    Edité par Alextronikk 18 septembre 2020 à 10:36:21

    • Partager sur Facebook
    • Partager sur Twitter
      23 septembre 2020 à 13:11:39

      Pas d'idée pour résoudre mon problème ?
      • Partager sur Facebook
      • Partager sur Twitter
        23 septembre 2020 à 18:29:57

        peut-être utilisant la classe Period (elle te permet de récupérer directement la différence entre 2 dates en terme d'années/mois/jour):
        import java.time.temporal.ChronoUnit;
        import java.time.LocalDateTime;
        import java.time.Month;
        import java.time.Period;
         
        public class Main
        {
        	public static void main(String[] args) {
        		LocalDateTime dateFrom = LocalDateTime.of(2015, Month.JULY, 12,10,26,10);
                LocalDateTime dateTo = LocalDateTime.of(2016, Month.AUGUST, 22,22,54,10);
        		System.out.println(ChronoUnit.YEARS.between(dateFrom,dateTo));
        		System.out.println(Period.between(dateFrom.toLocalDate(),dateTo.toLocalDate())); // affiche P1Y1M10D pour 1 an, 1 mois et 10 jours
        		System.out.println(Period.between(dateFrom.toLocalDate(),dateTo.toLocalDate()).getDays()); // .getMonths() // .getYears()
        	}
        }
        • Partager sur Facebook
        • Partager sur Twitter
          27 décembre 2020 à 14:15:15

          Bonjour,
          Merci  pour votre réponse.
          Désolé pour le délais mais j'ai été très occupé ces derniers temps.

          Pour votre répons ça fonctionne presque dans mon cas XD
          En effet il faudrait que la période prenne compte des heures minutes secondes.
          Dans mon cas si les dates sont :
              - 27/12/2020 14:04:11
              - 27/01/2021 14:04:11
          J'ai bien 1 mois pile mais avec :
              - 27/12/2020 14:04:12    << Une seconde de plus
              - 27/01/2021 14:04:11
          J'ai 1mois 0jours 23heures 59minutes 59secondes
          Je penses que je devrais avoir 30jours 23heures 59minutes 59secondes
          En revanche si je mets:
              - 28/12/2020 14:04:12    << Une seconde et un jour de plus
              - 27/01/2021 14:04:11
          J'ai 30jours 23heures 59minutes 59secondes

          Voila voila. j’espère être assez clair dans mes explication farfelues ! XD

          -
          Edité par Alextronikk 27 décembre 2020 à 14:18:56

          • Partager sur Facebook
          • Partager sur Twitter
            27 décembre 2020 à 15:32:26

            Bonjour,

            Comme les mois n'ont pas une durée fixe, on ne peut pas exprimer une durée en mois. On le fait dans la vraie vie car quand on a juste besoin d'un ordre de grandeur, ce calcul "à la louche" nous suffit. Si on veut être vraiment  précis, on ne peut utiliser que des durées fixes comme les jours et les semaines.

            • Partager sur Facebook
            • Partager sur Twitter
              4 janvier 2021 à 10:36:21

              Hello,

              Enfaite l'idée ici est de faire un compte a rebours. La fonction énoncée juste avant fonctionne mais sans prendre en compte les heures, minutes, secondes.

              Ce qu'il faudrait c'est un calcul de date à date en tenant comptes des heures, minutes, secondes. La fonctionn Period.between() fait bien le taf pour le calcul des jours. Il me faudrait une fonction similaire avec des LocalDateTime à la place des LocalDate

              • Partager sur Facebook
              • Partager sur Twitter
                4 janvier 2021 à 12:52:32

                tu as la fonction until, ou between (cf la doc de LocalDateTime https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/time/LocalDateTime.html#until(java.time.temporal.Temporal,java.time.temporal.TemporalUnit)  )
                delta=dateFrom.until(dateTo,SECONDS); //MINUTES, HOURS, DAYS, WEEKS, MONTHS, YEARS possible (entre autres)
                delta=ChronoUnit.SECONDS.between(dateTo,DateFrom); // comme j'avais déjà utilisé dans l'exemple de ma réponse mais avec YEARS
                • Partager sur Facebook
                • Partager sur Twitter

                Problème de calcul de différence entre 2 dates

                × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                • Editeur
                • Markdown