Détermination de la différence entre deux heures

0/5 (5 avis)

Snippet vu 3 878 fois - Téléchargée 4 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
denisbertin Messages postés 248 Date d'inscription lundi 22 avril 2013 Statut Membre Dernière intervention 13 mai 2023 1
5 juin 2018 à 00:01
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.
korgis Messages postés 420 Date d'inscription samedi 17 mai 2003 Statut Membre Dernière intervention 6 mai 2019 17
Modifié le 4 juin 2018 à 16:12
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.
korgis Messages postés 420 Date d'inscription samedi 17 mai 2003 Statut Membre Dernière intervention 6 mai 2019 17
4 juin 2018 à 14:51
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 17
Modifié le 4 juin 2018 à 14:47
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.
Cirec Messages postés 3833 Date d'inscription vendredi 23 juillet 2004 Statut Modérateur Dernière intervention 18 septembre 2022 50
4 juin 2018 à 13:39
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,

@+

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.