Calcul de durée entre deux dates.

Calcul de durée entre deux dates. - Divers - Programmation

Marsh Posté le 30-01-2013 à 20:33:01    

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.

Reply

Marsh Posté le 30-01-2013 à 20:33:01   

Reply

Marsh Posté le 31-01-2013 à 08:54:58    

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
Reply

Marsh Posté le 31-01-2013 à 11:08:42    

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

Reply

Marsh Posté le 31-01-2013 à 16:13:25    

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é!  --
Reply

Marsh Posté le 31-01-2013 à 16:38:06    

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
Reply

Marsh Posté le 31-01-2013 à 17:09:11    

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
Reply

Marsh Posté le 31-01-2013 à 17:35:04    

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 ?

Reply

Marsh Posté le 01-02-2013 à 03:43:11    

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é!  --
Reply

Marsh Posté le 01-02-2013 à 13:17:49    

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 ?

Reply

Marsh Posté le 01-02-2013 à 16:32:18    

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


Reply

Marsh Posté le 01-02-2013 à 16:32:18   

Reply

Marsh Posté le 02-02-2013 à 01:02:21    

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é!  --
Reply

Marsh Posté le 02-02-2013 à 01:56:22    

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.

Reply

Marsh Posté le 02-02-2013 à 02:19:56    

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é!  --
Reply

Marsh Posté le 02-02-2013 à 02:26:32    

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 :/

Reply

Marsh Posté le 19-01-2015 à 11:50:33    

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.
Reply

Marsh Posté le 19-01-2015 à 13:42:09    

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
Reply

Marsh Posté le 23-01-2015 à 15:36:53    

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
Reply

Marsh Posté le 23-01-2015 à 15:46:59    

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
Reply

Marsh Posté le 23-01-2015 à 16:15:03    

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

Reply

Marsh Posté le 30-05-2015 à 21:07:02    

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.
Reply

Marsh Posté le 30-05-2015 à 21:47:36    

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.
Reply

Marsh Posté le 30-05-2015 à 22:04:06    

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.
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed