Détermination de la différence entre deux heures

Soyez le premier à donner votre avis sur cette source.

Snippet vu 1 553 fois - Téléchargée 1 fois

Contenu du snippet

//Format des pchar 00:00:00 passé en paramètre, en sortie format identique
function Difference_entre_deux_heure(apc,bpc:pchar):string;
  var cumulation:string;
      time_hour,time_minute,time_seconde:integer;
      time_hour_terminal,time_minute_terminal,time_seconde_terminal:integer;
      time_begin,time_ending,time_difference:integer;
      hour,minute,seconde:integer;
  begin
  //Détermination de l'heure de début de traitement
  time_hour:=strtoint(apc[0]+apc[1]);
  time_minute:=strtoint(apc[3]+apc[4]);
  time_seconde:=strtoint(apc[6]+apc[7]);
  //Détermination de l'heure de fin de traitement
  time_hour_terminal:=strtoint(bpc[0]+bpc[1]);
  time_minute_terminal:=strtoint(bpc[3]+bpc[4]);
  time_seconde_terminal:=strtoint(bpc[6]+bpc[7]);
  //Déplacement des heures inférieurs au temps de départ.
  if time_hour_terminal<time_hour then
    time_hour_terminal:=time_hour_terminal+24; 
  //Cumul des temps
  time_begin:=3600*time_hour+time_minute*60+time_seconde;
  time_ending:=3600*time_hour_terminal+time_minute_terminal*60+time_seconde_terminal;
  time_difference:=time_ending-time_begin;
  hour:=time_difference div 3600;
  time_difference:=time_difference-hour*3600;
  minute:=time_difference div 60;
  seconde:=time_difference-minute*60;
  if hour < 10 then
    cumulation:='0'+inttostr(hour)
  else
    cumulation:=inttostr(hour);
  cumulation:=cumulation+':';
  if minute<10 then
    cumulation:=cumulation+'0'+inttostr(minute)
  else
    cumulation:=cumulation+inttostr(minute); {Denis Bertin Stéphane}
  cumulation:=cumulation+':';
  if seconde<10 then
    cumulation:=cumulation+'0'+inttostr(seconde)
  else
    cumulation:=cumulation+inttostr(seconde);
  result:=cumulation;
  end; {Différence_entre_deux_heure}

Compatibilité : 1.0

A voir également

Ajouter un commentaire

Commentaires

Cirec
Messages postés
3809
Date d'inscription
vendredi 23 juillet 2004
Statut
Modérateur
Dernière intervention
1 septembre 2019
32 -
Bonjour,

pourquoi ne pas faire tout simplement:
const
  T1 = '18:52:24';
  T2 = '05:18:58';
begin
  Caption := TimeToStr(StrToTime(T1)-StrToTime(T2))
end;

fonctionne tout aussi bien à l'inverse:
const
  T1 = '18:52:24';
  T2 = '05:18:58';
begin
  Caption := TimeToStr(StrToTime(T2)-StrToTime(T1))
end;


Cordialement,

@+
korgis
Messages postés
420
Date d'inscription
samedi 17 mai 2003
Statut
Membre
Dernière intervention
6 mai 2019
15 -
Salut,

Tu m'as grillé sur ce coup, Cirec !

J'étais en train de tester le code de notre ami, et voici le fruit de ma réflexion :

Il y a un gros bug si la valeur des minutes de bpc est inférieures à celle des minutes de apc. Par exemple si apc = '05:18:06' et bpc = '05:17:03'.

Je n'ai pas compris l'utilité de passer des PChar en paramètres...

Voici un code efficace malgré sa simplicité :

function DiffTime(H1, H2: string): string;
begin
  Result := TimeToStr(StrToTime(H2) + (24 - StrToTime(H1)));
end;


Car attention à la subtilité : pour avoir l'écart entre les 2 Time, , il faut additionner la durée restant à effectuer jusqu'à minuit par Time1+ le temps déjà effectué par Time2, sinon le calcul sera faux dès que la valeur de Time2 est inférieure à celle de Time 1.

Bref, dit différemment, il ne suffit pas de faire la différence entre le temps de plus grande valeur moins le temps de moindre valeur.

Cordialement.
korgis
Messages postés
420
Date d'inscription
samedi 17 mai 2003
Statut
Membre
Dernière intervention
6 mai 2019
15 -
Dit encore autrement : remaining time1 + elapsed time2 ^^
korgis
Messages postés
420
Date d'inscription
samedi 17 mai 2003
Statut
Membre
Dernière intervention
6 mai 2019
15 -
Mille excuses, Cirec, ton approche est la seule correcte.

Le problème à résoudre est mal posé. Le résultat d'une fonction qui retourne la
différence entre deux heures dont le jour est indéterminé n'a pas de sens.

Dans la logique d'une différence entre deux heures du même jour, si l'on veut pouvoir passer les heures à comparer dans un ordre indifférent, on peut faire :

// uses Math
function DiffTime2(H1, H2: string): string;
begin
  Result := TimeToStr(Max(StrToTime(H1), StrToTime(H2)) - Min(StrToTime(H1), StrToTime(H2)));
end;


Cordialement.
denisbertin
Messages postés
197
Date d'inscription
lundi 22 avril 2013
Statut
Membre
Dernière intervention
27 septembre 2019
1 -
Pour se replacer dans le contexte d'élaboration de cette fonction, mon logiciel affiche et égrène les heures, minute, seconde de chaque action d'un "utilisateur" pour un jour donné, ces heures apparaissent donc dans l'ordre croissant. T1 seras toujours inférieur à T2 sauf si l'on change de jours à minuit. D’où le fait d'ajouter à T2 24 heures, sinon j’apprécie vos commentaires il sont justifiées.

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.