Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1430 connectés 

  FORUM HardWare.fr
  Programmation
  Divers

  Calcul de durée entre deux dates.

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Calcul de durée entre deux dates.

n°2173420
Profil sup​primé
Posté le 30-01-2013 à 20:33:01  answer
 

Bonjour,
 
Je me suis cassé les dent une nuit pour finalement laisser tomber mais je viens vous poser la question !
 
Comment calculer la durée entre deux dates en [Années-jours-heures:minute:secondes.miliseconde] ?
 
A vous si ça vous amuse ou si j'ai un problème.

mood
Publicité
Posté le 30-01-2013 à 20:33:01  profilanswer
 

n°2173464
x1fr
Posté le 31-01-2013 à 08:54:58  profilanswer
 

Ca va dépendre du langage utilisé, du format des dates, etc...
 
Par exemple en .net il y a le format datetime, tu peux soustraire 2 datetime entre eux, tu obtiens un timespan qui t'indique le nombre de jours, heures, etc...
 
Dans d'autres langages c'est plutot un timestamp, qui représente le nombre de secondes. Tu peux donc faire la différence entre 2 timestamp, et avec des divisions et des modulos calculer le nombre d'années, jours, etc...


---------------
Origin / PSN / Steam / Uplay : x1fr - bnet : Fab#2717
n°2173478
Profil sup​primé
Posté le 31-01-2013 à 11:08:42  answer
 

Ok merci pour ta réponse.
 
Ben comme d'hab, c'est avec Ada.

n°2173550
gilou
Modérateur
Modzilla
Posté le 31-01-2013 à 16:13:25  profilanswer
 

Elles sont après 1970 tes dates?
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°2173569
Profil sup​primé
Posté le 31-01-2013 à 16:38:06  answer
 

gilou a écrit :

Elles sont après 1970 tes dates?
A+,


 
Non, techniquement, la limite inférieur c'est 1901-01-01 0.0 et la sup c'est 2399-12-31 86400.0 ou un truc dans le genre. c'est un Ada.Calendar.Time.


Message édité par Profil supprimé le 31-01-2013 à 17:23:41
n°2173582
x1fr
Posté le 31-01-2013 à 17:09:11  profilanswer
 

Je ne connais (toujours pas :p) ada, mais d'après :
 
http://archive.adaic.com/standards [...] 09-06.html
 

Code :
  1. function "-"  (LEFT : TIME;     RIGHT : TIME)     return DURATION;


 
Tu peux effectuer une soustraction de 2 objets de type TIME, et obtenir un objet de type DURATION en retour.
 
Et d'apres http://www.adapower.com/rm95/RM-9-6.html :
 

Citation :

There is a predefined fixed point type named Duration, declared in the visible part of package Standard; a value of type Duration is used to represent the length of an interval of time, expressed in seconds


 
Donc la différence entre 2 TIME te donnerai le nombre de secondes qui sépare les 2.
 
A partir de là, tu convertis le nombre de secondes en années, mois, etc... (désolé y a pleins de convertisseurs sur le net mais je trouve pas une explication sur la méthode).
 
En gros si tu as par exemple 3500 secondes tu fais :
- pour les heures le résultat entier de 3750 / 3600 -> 1h, reste 150 secondes
- pour les minutes le résultat entier de 150 / 60 -> 2min, reste 30sec
- pour les secondes le reste -> 30 sec
Donc 3500sec = 1h2min5ec
 
3600 pour 60sec par minute * 60min par heure
60 pour 60sec par minute
donc tu fais pareil avec 86400 (60*60*24) pour les jours etc...


---------------
Origin / PSN / Steam / Uplay : x1fr - bnet : Fab#2717
n°2173585
Profil sup​primé
Posté le 31-01-2013 à 17:35:04  answer
 

x1fr a écrit :

Je ne connais (toujours pas :p) ada, mais d'après :
 
http://archive.adaic.com/standards [...] 09-06.html
 

Code :
  1. function "-"  (LEFT : TIME;     RIGHT : TIME)     return DURATION;


 
Tu peux effectuer une soustraction de 2 objets de type TIME, et obtenir un objet de type DURATION en retour.
 
Et d'apres http://www.adapower.com/rm95/RM-9-6.html :
 

Citation :

There is a predefined fixed point type named Duration, declared in the visible part of package Standard; a value of type Duration is used to represent the length of an interval of time, expressed in seconds


 
Donc la différence entre 2 TIME te donnerai le nombre de secondes qui sépare les 2.
 


 
D'abord merci encore pour ta réponse.
 
Alors justement j'ai fait et refait des test et
 
Je ne peut pas calculer tous les intervalles.
 

Citation :

Ne peut calculer l'interval entre Time minimum et maximum.


Citation :

Ne peut calculer l'interval entre  heure courante et maximum.


 
Par contre pour l'intervalle entre Time minimum et Clock ça passe.

Citation :

Elasped time :  3537106230.915097000


Mais jusqu'à quand ?

n°2173647
gilou
Modérateur
Modzilla
Posté le 01-02-2013 à 03:43:11  profilanswer
 

J'ai été jeter un oeil à gnat: package Ada.Calendar  
Il y a  
function Time_Of
     (Year    : Year_Number;
      Month   : Month_Number;
      Day     : Day_Number;
      Seconds : Day_Duration := 0.0) return Time
qui va retourner un Time pour chacune de tes dates, et un
procedure Difference
        (Left         : Time;
         Right        : Time;
         Days         : out Long_Integer;
         Seconds      : out Duration;
         Leap_Seconds : out Integer)
pour faire la différence entre les deux.
 
A+,


Message édité par gilou le 01-02-2013 à 03:43:58

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°2173757
Profil sup​primé
Posté le 01-02-2013 à 13:17:49  answer
 

Oui J'ai découvert aussi la Difference hier.
 
Après pour compter les année, tout les quatre ans je supprime un jour de plus et c'est bon ?

n°2173796
Profil sup​primé
Posté le 01-02-2013 à 16:32:18  answer
 

J'ai testé un truc.
 
 

Code :
  1. with Ada.Calendar;
  2. use Ada.Calendar;
  3.  
  4. with Ada.Calendar.Arithmetic;
  5. use Ada.Calendar.Arithmetic;
  6. with Ada.Text_Io;
  7. use Ada;
  8. procedure Main2 is
  9.  
  10.   The_Years_Top   : Year_Number := 1901;
  11.   The_Years_Bot   : Year_Number := 2399;
  12.  
  13.   Bi          : Natural            := 0;
  14.  
  15.   Years       : Natural            := 0;
  16.   The_Days    : Day_Count          := 0;
  17.   Seconds     : Duration           := 0.0;
  18.   Leap_Second : Leap_Seconds_Count := 0;
  19. begin
  20.  
  21.  
  22.  
  23.   Difference(Time_Of(The_Years_Bot, Month_Number'last, Day_Number'Last, 0.0),
  24.              Time_Of(The_Years_Top, Month_Number'First, Day_Number'First, 0.0),
  25.              The_Days,
  26.              Seconds,
  27.              Leap_Second);
  28.  
  29.   Years := Natural(The_Days / 365);
  30.   Bi := (The_Years_Bot - The_Years_Top)/4;
  31.   The_Days := The_Days - Day_Count((365 * Years)+bi);
  32.  
  33.  
  34.   Text_Io.Put_Line("Elapsed years : " & Natural'Image(Years));
  35.   Text_Io.Put_Line("Elapsed days : " & Day_Count'Image(The_Days));
  36.   Text_Io.Put_Line("Elapsed Sec : " & Duration'Image(Seconds));
  37. end Main2;


 
Résultat :

Citation :

Elapsed years :  499
Elapsed days : -4
Elapsed Sec :  0.000000000


mood
Publicité
Posté le 01-02-2013 à 16:32:18  profilanswer
 

n°2173856
gilou
Modérateur
Modzilla
Posté le 02-02-2013 à 01:02:21  profilanswer
 

Citation :

Bi := (The_Years_Bot - The_Years_Top)/4;

C'est ce qui est faux (déjà tu comptes 2100, 2200 et 2300 dans le lot or ils ne sont pas bissextiles, et de plus, pour le dernier jour de trop, c'est probablement une  histoire d'intervalles).
 
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°2173860
Profil sup​primé
Posté le 02-02-2013 à 01:56:22  answer
 

Merci Gilou,
 
J'ai modifié monde code comme ceci :

Code :
  1. for I in The_Years_Top..The_Years_Bot loop
  2.      if Leap_Year(I) then
  3.         Bi := Bi + 1;
  4.      end if;
  5.   end loop;
  6.  
  7.   The_Days := The_Days - (Day_Count((365 * Years)+bi)-1);


 
Il me reste un décalage de 23 heures à élucider.
 
Avec ma date d'anniversaire à 43 ans de différence j'ai bien 43 ans 0 jour mais 82800.0 seconde de trop.

n°2173862
gilou
Modérateur
Modzilla
Posté le 02-02-2013 à 02:19:56  profilanswer
 

Citation :

(Day_Count((365 * Years)+bi)-1)

Il correspond à quoi ce -1?
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°2173863
Profil sup​primé
Posté le 02-02-2013 à 02:26:32  answer
 

gilou a écrit :

Citation :

(Day_Count((365 * Years)+bi)-1)

Il correspond à quoi ce -1?
A+,


 
A rien, j'essayais un truc pour l'histoire d'intervalle :/

n°2248729
par l'anne​au de l'ia
word master
Posté le 19-01-2015 à 11:50:33  profilanswer
 

Bonjour,
 
Je reviens ici pour avoir votre expertise.... J'ai fait à vue de nez...
Toujours pour calculer la durée entre deux date exprimé en Years months days houres minutes seconds et rest.
 
D'abord je compte les années, les mois et les jours :

Code :
  1. Arithmetic.Difference (Date, Timer_Start, Days_total, Seconds_Total, Leap_seconds);          
  2. Timer_Years := Natural(Float(Days_Total) / 365.25);
  3. Days_Total := Days_Total - Day_Count(float(Timer_Years) * 365.25);
  4. Timer_Months := Natural(((float(Days_Total) / Float(365.25)) / 30.0));
  5. Days_Total := Days_Total - Day_Count(((Float(Timer_months) * Float(365.25)) * 30.0));
  6. Timer_Days := Natural(Days_Total);


 
Reste à faire une image formaté des secondes restante pour le jour courant.

Code :
  1. Formatting.Image(Seconds_Total, True)


 
C'est surtout au niveau arithmétique je je vais galérer si c'est pas bon.


---------------
Toute expression prend un sens spirituel qui nous influence dans notre quête de l'Homme.
n°2248735
rufo
Pas me confondre avec Lycos!
Posté le 19-01-2015 à 13:42:09  profilanswer
 

1) Faut que tu gères le nb de jours pour chaque mois (30 ou 31) ainsi que le cas des années bissextiles (février à 28 ou 29 jours).
 
2) faut que tu gères le pb de l'heure d'été et de l'heure d'hiver. En effet, suivant l'intervalle considéré, cette heure en plus ou en moins peut s'annuler. Du coup, faut pas considérer qu'une journée = 84400 secondes ;)
 
Je t'invites à regarder le code de mon applis Astres (cf ma signature), en particulier la fonction getGraphicAxeXValuesStats() du fichier /Astres/Support/Stats/StatsLibrary.php
 
3) Si ton algo est basé sur un calcul de secondes écoulé uniquement, attention aux secondes intercalaires qui sont ajoutées certaines années en juin ou en décembre ;)

Message cité 1 fois
Message édité par rufo le 19-01-2015 à 13:43:48

---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
n°2249164
flawlessro​ll
Brave jump!
Posté le 23-01-2015 à 15:36:53  profilanswer
 

rufo a écrit :

2) faut que tu gères le pb de l'heure d'été et de l'heure d'hiver. En effet, suivant l'intervalle considéré, cette heure en plus ou en moins peut s'annuler. Du coup, faut pas considérer qu'une journée = 84400 secondes ;)


 
Avant toute opération il faut convertir les dates entrées en temps universel (UTC) sinon c'est vite l'horreur oui.  [:kermit]  
 
Pour le reste s'il s'agit de calculs de dates à visée astronomique, je ne saurais trop lui conseiller d'utiliser le jour julien en interne. Ça se représente très bien en virgule fixe sur un entier ce qui élimine la plupart des pertes de précision.


Message édité par flawlessroll le 23-01-2015 à 16:14:27
n°2249166
rufo
Pas me confondre avec Lycos!
Posté le 23-01-2015 à 15:46:59  profilanswer
 

Attention : comme l'indique l'article que tu donnes en ligne, jour julien <> calendrier julien :o
 

Citation :

Le qualificatif julien est source d'ambigüités : les datations en jours juliens et les dates du calendrier julien n'ont aucun rapport et ne doivent pas être confondues.


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
n°2249175
flawlessro​ll
Brave jump!
Posté le 23-01-2015 à 16:15:03  profilanswer
 

Corrigé, merci ! Un abus de langage malheureux. :pt1cable:

n°2259153
par l'anne​au de l'ia
word master
Posté le 30-05-2015 à 21:07:02  profilanswer
 

Bonjour,
 
 
Mon nouveau code :
 

Code :
  1. procedure Difference_In_Years(Top_Date : in Time;
  2.                                 Bot_Date : in Time;
  3.                                 Years    : out Natural;
  4.                                 Months   : out Natural;
  5.                                 Days     : out Natural;
  6.                                 Houres   : out Natural;
  7.                                 Minutes  : out Natural;
  8.                                 Second   : out Natural;
  9.                                 Rest     : out Duration) is      
  10.      
  11.      function Is_Leap_Year (Year : Integer) return Boolean is
  12.      begin
  13.         return (Year rem 4 = 0) and ((Year rem 100 /= 0) or (Year rem 16 = 0));
  14.      end Is_Leap_Year;
  15.      
  16.      pragma Inline (Is_Leap_Year);
  17.      
  18.      Days_Months_Count : constant array (Month_Number) of Day_Number := (31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);
  19.      
  20.      
  21.      function Last_Days(Years , Months : in Natural) return Natural is        
  22.      begin        
  23.         if Months = 1 then
  24.            return Days_Months_Count(12);
  25.         elsif Months /= 3 then
  26.            return Days_Months_Count(Months-1);
  27.         end if;
  28.        
  29.         if Is_Leap_Year(Years) then
  30.            return Days_Months_Count(2) + 1;
  31.         else
  32.            return Days_Months_Count(2);
  33.         end if;
  34.      end Last_Days;
  35.  
  36.      
  37.      Top_Seconds : constant Day_Duration := Seconds(Top_Date);
  38.      Bot_Seconds : constant Day_Duration := Seconds(Bot_Date);
  39.      Top_Day     : constant Day_Number := Day(Top_Date);
  40.      Bot_Day     : constant Day_Number := Day(Bot_Date);
  41.      Top_Year    : constant Year_Number := Year(Top_Date);
  42.      Bot_Year    : constant Year_Number := Year(Bot_Date);
  43.      Top_Month   : constant Month_Number := Month(Top_Date);
  44.      Bot_Month   : constant Month_Number := Month(Bot_Date);
  45.      
  46.      Years_Number  : Integer := 0;
  47.      Months_Number : Integer := 0;
  48.      Days_Number   : Integer := 0;            
  49.      
  50.      Total_Duration : Duration := Bot_Seconds - Top_Seconds;
  51.   begin
  52.      
  53.      if Top_Date > Bot_Date then
  54.         raise Constraint_Error;
  55.      end if;
  56.      
  57.      Years    := 0;
  58.      Months   := 0;
  59.      Days     := 0;
  60.      Houres   := 0;
  61.      Minutes  := 0;
  62.      Second   := 0;
  63.      Rest     := 0.0;
  64.      
  65.      Years_Number := (Bot_Year - Top_Year - 1);
  66.      
  67.      Months_Number := Bot_Month;
  68.      
  69.      if (Bot_Month > Top_Month) or ((Bot_Month = Top_Month) and (Bot_Day >= Top_Day)) then        
  70.  
  71.         Years_Number := Years_Number + 1;
  72.        
  73.      else        
  74.         Months_Number := Bot_Month + 12;
  75.      end if;
  76.      
  77.      Months_Number := (Months_Number - Top_Month - 1);
  78.      
  79.      if Bot_Day >= Top_Day then
  80.  
  81.         Months_Number := Months_Number + 1;
  82.         Days_Number := Bot_Day - Top_Day;
  83.      else
  84.         Days_Number := Last_Days (Bot_Year, Bot_Month) - Top_Day;
  85.         if Days_Number < 0 then
  86.            Days_Number := Days_Number + Bot_Day;
  87.         end if;                  
  88.      end if;
  89.      Days := Days_Number;
  90.      Months := Months_Number;
  91.      Years := Years_Number;
  92.      
  93.      if Bot_Seconds >= Top_seconds then
  94.         Total_Duration := (Bot_Seconds + Top_Seconds) - 86400.0;
  95.      Days := Days + 1;
  96.      else
  97.         Total_Duration := (86400.0 - Top_Seconds) + (Bot_Seconds);
  98.      end if;
  99.      Formatting.Split(Total_Duration, Houres, Minutes, Second, Rest);        
  100.   end Difference_In_Years;


 
Je me suis fait aider, et la je viens de corriger au moins un peu.
Mais j'ai peut-être introduit d'autre problème.


---------------
Toute expression prend un sens spirituel qui nous influence dans notre quête de l'Homme.
n°2259157
par l'anne​au de l'ia
word master
Posté le 30-05-2015 à 21:47:36  profilanswer
 

Et peut-être, remplacer cette condition :
 

Code :
  1. if Days_Number < 0 then


 
 
par

Code :
  1. if Days_Number <= 0 then


---------------
Toute expression prend un sens spirituel qui nous influence dans notre quête de l'Homme.
n°2259160
par l'anne​au de l'ia
word master
Posté le 30-05-2015 à 22:04:06  profilanswer
 

Je le recolle entièrement, j'ai apporté trois correction, une dans Last_Years, une à la comparaison ci dessus qui est avec 1 et days -1 en bas de code.
 

Code :
  1. procedure Difference_In_Years(Top_Date : in Time;
  2.                                 Bot_Date : in Time;
  3.                                 Years    : out Natural;
  4.                                 Months   : out Natural;
  5.                                 Days     : out Natural;
  6.                                 Houres   : out Natural;
  7.                                 Minutes  : out Natural;
  8.                                 Second   : out Natural;
  9.                                 Rest     : out Duration) is      
  10.      
  11.      function Is_Leap_Year (Year : Integer) return Boolean is
  12.      begin
  13.         return (Year rem 4 = 0) and ((Year rem 100 /= 0) or (Year rem 16 = 0));
  14.      end Is_Leap_Year;
  15.      
  16.      pragma Inline (Is_Leap_Year);
  17.      
  18.      Days_Months_Count : constant array (Month_Number) of Day_Number := (31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);
  19.      
  20.      
  21.      function Last_Days(Years , Months : in Natural) return Natural is        
  22.      begin        
  23.         if Months = 1 then
  24.            return Days_Months_Count(12);
  25.         elsif Months /= 3 then
  26.            return Days_Months_Count(Months-1);                  
  27.         elsif Is_Leap_Year(Years) then
  28.            return Days_Months_Count(2) + 1;
  29.         else
  30.            return Days_Months_Count(2);
  31.         end if;
  32.      end Last_Days;
  33.  
  34.      
  35.      Top_Seconds : constant Day_Duration := Seconds(Top_Date);
  36.      Bot_Seconds : constant Day_Duration := Seconds(Bot_Date);
  37.      Top_Day     : constant Day_Number := Day(Top_Date);
  38.      Bot_Day     : constant Day_Number := Day(Bot_Date);
  39.      Top_Year    : constant Year_Number := Year(Top_Date);
  40.      Bot_Year    : constant Year_Number := Year(Bot_Date);
  41.      Top_Month   : constant Month_Number := Month(Top_Date);
  42.      Bot_Month   : constant Month_Number := Month(Bot_Date);
  43.      
  44.      Years_Number  : Integer := 0;
  45.      Months_Number : Integer := 0;
  46.      Days_Number   : Integer := 0;            
  47.      
  48.      Total_Duration : Duration := Bot_Seconds - Top_Seconds;
  49.   begin
  50.      
  51.      if Top_Date > Bot_Date then
  52.         raise Constraint_Error;
  53.      end if;
  54.      
  55.      Years    := 0;
  56.      Months   := 0;
  57.      Days     := 0;
  58.      Houres   := 0;
  59.      Minutes  := 0;
  60.      Second   := 0;
  61.      Rest     := 0.0;
  62.      
  63.      Years_Number := (Bot_Year - Top_Year - 1);
  64.      
  65.      Months_Number := Bot_Month;
  66.      
  67.      if (Bot_Month > Top_Month) or ((Bot_Month = Top_Month) and (Bot_Day >= Top_Day)) then        
  68.  
  69.         Years_Number := Years_Number + 1;
  70.        
  71.      else        
  72.         Months_Number := Bot_Month + 12;
  73.      end if;
  74.      
  75.      Months_Number := (Months_Number - Top_Month - 1);
  76.      
  77.      if Bot_Day >= Top_Day then
  78.     
  79.         Months_Number := Months_Number + 1;
  80.         Days_Number := Bot_Day - Top_Day;
  81.      else
  82.         Days_Number := Last_Days (Bot_Year, Bot_Month) - Top_Day;
  83.         if Days_Number <= 1 then
  84.            Days_Number := Days_Number + Bot_Day;
  85.         end if;                  
  86.      end if;
  87.      Days := Days_Number;
  88.      Months := Months_Number;
  89.      Years := Years_Number;
  90.      
  91.      if Bot_Seconds >= Top_seconds then
  92.         Total_Duration := (Bot_Seconds + Top_Seconds) - 86400.0;
  93.      Days := Days + 1;
  94.      else
  95.         Total_Duration := (86400.0 - Top_Seconds) + (Bot_Seconds);
  96.      Days := Days - 1;
  97.      end if;
  98.      Formatting.Split(Total_Duration, Houres, Minutes, Second, Rest);        
  99.   end Difference_In_Years;


 
 
Finalement c'est ça mon algo.
 

Code :
  1. with Ada.Calendar.Formatting;
  2. use Ada;
  3. with Ada.Strings.Fixed;
  4. use Ada.Strings;
  5.  
  6. package body Arch.Utils is
  7.  
  8.   function Integer_Image (Value : in Integer) return String is
  9.   begin
  10.      if Value < 0 then
  11.      return
  12.        '-' & Integer'Image(Value)(Fixed.Index_Non_Blank(Integer'Image(Value)(2..Integer'Image(Value)'Last))..Integer'Image(Value)'Last);
  13.      else
  14.      return
  15.        Integer'Image(Value)(Fixed.Index_Non_Blank(Integer'Image(Value))..Integer'Image(Value)'Last);
  16.      end if;
  17.   end Integer_Image;
  18.  
  19.  
  20.   function YMD_Elapsed_String(Years    : in Natural;
  21.                               Months   : in Natural;
  22.                               Days     : in Natural) return String is
  23.   begin
  24.      return Integer_Image(Years) &
  25.        "y, " &
  26.        Integer_Image(Months) &
  27.        "m, " &
  28.        Integer_Image(Days) &
  29.        "d, ";        
  30.   end YMD_Elapsed_String;
  31.  
  32.  
  33.  
  34.   procedure Difference_In_Years(Top_Date : in Time;
  35.                                 Bot_Date : in Time;
  36.                                 Years    : out Natural;
  37.                                 Months   : out Natural;
  38.                                 Days     : out Natural;
  39.                                 Houres   : out Natural;
  40.                                 Minutes  : out Natural;
  41.                                 Second   : out Natural;
  42.                                 Rest     : out Duration) is      
  43.      
  44.      function Is_Leap_Year (Year : Integer) return Boolean is
  45.      begin
  46.         return (Year rem 4 = 0) and ((Year rem 100 /= 0) or (Year rem 16 = 0));
  47.      end Is_Leap_Year;
  48.      
  49.      pragma Inline (Is_Leap_Year);
  50.      
  51.      Days_Months_Count : constant array (Month_Number) of Day_Number := (31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);
  52.      
  53.      
  54.      function Last_Days(Years , Months : in Natural) return Natural is        
  55.      begin        
  56.         if Months = 1 then
  57.            return Days_Months_Count(12);
  58.         elsif Months /= 3 then
  59.            return Days_Months_Count(Months-1);
  60.      elsif Is_Leap_Year(Years) then
  61.            return Days_Months_Count(2) + 1;
  62.         else
  63.            return Days_Months_Count(2);
  64.         end if;
  65.      end Last_Days;
  66.  
  67.      
  68.      Top_Seconds : constant Day_Duration := Seconds(Top_Date);
  69.      Bot_Seconds : constant Day_Duration := Seconds(Bot_Date);
  70.      Top_Day     : constant Day_Number := Day(Top_Date);
  71.      Bot_Day     : constant Day_Number := Day(Bot_Date);
  72.      Top_Year    : constant Year_Number := Year(Top_Date);
  73.      Bot_Year    : constant Year_Number := Year(Bot_Date);
  74.      Top_Month   : constant Month_Number := Month(Top_Date);
  75.      Bot_Month   : constant Month_Number := Month(Bot_Date);
  76.      
  77.      Years_Number  : Integer := 0;
  78.      Months_Number : Integer := 0;
  79.      Days_Number   : Integer := 0;            
  80.      
  81.      Total_Duration : Duration := Bot_Seconds - Top_Seconds;
  82.   begin
  83.      
  84.      if Top_Date > Bot_Date then
  85.         raise Constraint_Error;
  86.      end if;
  87.      
  88.      Years    := 0;
  89.      Months   := 0;
  90.      Days     := 0;
  91.      Houres   := 0;
  92.      Minutes  := 0;
  93.      Second   := 0;
  94.      Rest     := 0.0;
  95.      
  96.      Years_Number := (Bot_Year - Top_Year - 1);
  97.      
  98.      Months_Number := Bot_Month;
  99.      
  100.      if (Bot_Month > Top_Month) or ((Bot_Month = Top_Month) and (Bot_Day >= Top_Day)) then        
  101.  
  102.         Years_Number := Years_Number + 1;
  103.        
  104.      else        
  105.         Months_Number := Bot_Month + 12;
  106.      end if;
  107.      
  108.      Months_Number := (Months_Number - Top_Month - 1);
  109.      
  110.      if Bot_Day >= Top_Day then
  111.  
  112.         Months_Number := Months_Number + 1;
  113.         Days_Number := Bot_Day - Top_Day;
  114.      else
  115.         Days_Number := Last_Days (Bot_Year, Bot_Month) - Top_Day;
  116.         if Days_Number <= 1 then
  117.            Days_Number := Days_Number + Bot_Day;
  118.         end if;                  
  119.      end if;
  120.      Days := Days_Number;
  121.      Months := Months_Number;
  122.      Years := Years_Number;
  123.      
  124.      if Bot_Seconds >= Top_seconds then
  125.         Total_Duration := (Bot_Seconds - Top_Seconds);
  126.      else
  127.         Total_Duration := (86400.0 - Top_Seconds) + Bot_Seconds;
  128.         Days := Days - 1;
  129.      end if;
  130.      Formatting.Split(Total_Duration, Houres, Minutes, Second, Rest);        
  131.   end Difference_In_Years;
  132.  
  133. end Arch.Utils;


 


Message édité par par l'anneau de l'ia le 31-05-2015 à 01:21:12

---------------
Toute expression prend un sens spirituel qui nous influence dans notre quête de l'Homme.
mood
Publicité
Posté le   profilanswer
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Divers

  Calcul de durée entre deux dates.

 

Sujets relatifs
[RESOLU] Calcul d'une sérieCalcul html avec wordpress
Calcul[VBA]Calcul du nombre de lignes avec 3 conditions non numériques
Problème gestion des dates VBAcalcul de la convergence d'un RdN
Calculer la durée d'un pas selon le tempo et la signature rythmiquealgo calcul de volume objet 3d
Calcul de la norme d'un vecteur généré de façon aléatoire en langage CPHP : Calcul de moyenne par modalité
Plus de sujets relatifs à : Calcul de durée entre deux dates.


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR