Petit problème avec les dates !...

Fermé
Orel - 3 mars 2002 à 22:57
 voila - 12 mai 2010 à 21:50
J'aimerais connaître l'algorithme qui permet de déterminer le nombre de jours écoulés entre 2 dates !...
Merci.

23 réponses

C pa difficile, dis moi quel language de programmation tu utilises?
Essayes de réfléchir encore sur ca, je préfére ne pas te donner la solution tt de suite
@bientot
1
J'utilise Delphi 5, et je pensais pouvoir convertir les deux dates en nombres, puis les soustraires, mais je me rapelle plus comment j'ai fait !...
Merci.
0
PhP Messages postés 1767 Date d'inscription lundi 11 décembre 2000 Statut Membre Dernière intervention 23 décembre 2009 606
4 mars 2002 à 23:58
Bonsoir Orel

Delphi 4 propose les fonctions suivantes :


Date lit l'heure système.

Unité

SysUtils

Catégorie

routines de dates et d'heures

function Date: TDateTime;

Description

La fonction Date renvoie la date système.


-------------------------------------------------



DateToStr convertit une variable de type TDateTime en chaîne formatée.

Unité

SysUtils

Catégorie

routines de dates et d'heures

function DateToStr(Date: TDateTime): string;

Description

Utilisez DateToStr pour obtenir la représentation sous forme de chaîne d'une valeur date, dans le but de l'afficher. La conversion fait appel au format défini par la variable globale ShortDateFormat.

---------------------------


StrToDate convertit une chaîne en date.

Unité

SysUtils

Catégorie

routines de dates et d'heures

function StrToDate(const S: string): TDateTime;

Description

La date contenue dans la chaîne doit être valide.

La chaîne doit être constituée de deux ou trois nombres séparés par le caractère défini dans la variable globale DateSeparator. La séquence jour/mois/année est déterminée par la variable globale ShortDateFormat. Les combinaisons possibles sont MM/JJ/AA, JJ/MM/AA et AA/MM/JJ.

Si la chaîne contient uniquement deux nombres, la date est considérée comme faisant partie de l'année en cours (MM/JJ ou JJ/MM). Si la chaîne ne contient pas une date valide, une exception EConvertError est déclenchée.

Un format correct de date varie en fonction des valeurs de certaines constantes typées de date et d'heure.

Le format de la date varie quand les valeurs des variables de formatage date/heure sont modifiées.

La variable TwoDigitYearCenturyWindow contrôle l’interprétation des années sur deux chiffres. Si TwoDigitYearCenturyWindow est égale à 0, les années comprises entre 0 et 99 sont considérées comme faisant partie du siècle actuel. Si TwoDigitYearCenturyWindow est positive, sa valeur est soustraite de l’année en cours pour déterminer la « limite » ; les années à partir de la limite font partie du siècle actuel, alors que les années antérieures à la limite font partie du prochain siècle. Par exemple :

Année actuelle
TwoDigitYearCenturyWindow
Limite date =
jj/mm/03 date =
jj/mm/50 date =
jj/mm/68
1998 0 (valeur par défaut) 1900 1903 1950 1968
2002 0 (valeur par défaut) 2000 2003 2050 2068
1998 50 1948 2003 1950 1968
2000 50 1950 2003 1950 1968
2002 50 1952 2003 2050 1968
2020 50 1970 2003 2050 2068
2020 10 2010 2103 2050 2068
Vous pouvez utiliser TwoDigitYearCenturyWindow pour prolonger la vie des applications légales qui ne fonctionnent qu’avec des années de deux chiffres. Mais la meilleure solution consiste à demander les années sur quatre chiffres.

-------------------------------

DayOfWeek renvoie le jour de la semaine d'une date spécifiée.

Unité

SysUtils

Catégorie

routines de dates et d'heures

function DayOfWeek(Date: TDateTime): Integer;

Description

La fonction DayOfWeek renvoie le jour de la semaine d'une date sous la forme d'un entier compris entre 1 et 7. Dimanche est le premier jour de la semaine et samedi le septième.

---------------------------------------

EncodeDate renvoie un type TDateTime pour une Année, un Mois et un Jour spécifiés.

Unité

SysUtils

Catégorie

routines de dates et d'heures

function EncodeDate(Year, Month, Day: Word): TDateTime;

Description

La fonction EncodeDate renvoie une valeur de type TDateTime à partir des paramètres Year, Month et Day.

L'année doit être comprise entre 1 et 9999.

Les valeurs Month admises vont de 1 à 12.

Les valeurs Day admises vont de 2 à 28, 29, 30 ou 31, selon la valeur de Month. Par exemple, les valeurs possibles de Day pour le mois 2 (février) vont de 1 à 28, ou de 1 à 29 dans le cas d'une année bissextile.

Si les valeurs indiquées sont en-dehors de ces limites, une exception EConvertError est déclenchée. La valeur résultante est égale à 1 + le nombre de jours entre la date indiquée et le 30/12/1899.

-------------------------------------------------

DecodeDate scinde TDateTime en valeurs Année, Mois et Jour.

Unité

SysUtils

Catégorie

routines de dates et d'heures

procedure DecodeDate(Date: TDateTime; var Year, Month, Day: Word);

Description

La procédure DecodeDate sépare la valeur spécifiée par le paramètre Date en valeurs Année, Mois et Jour. Si la valeur TDateTime donnée est inférieure ou égale à zéro, l'année, le mois et le jour renvoient les paramètres initialisés à zéro.


--------------------------------------

EncodeTime renvoie un type TDateTime pour les heures, les minutes, les secondes et les millisecondes spécifiées.

Unité

SysUtils

Catégorie

routines de dates et d'heures

function EncodeTime(Hour, Min, Sec, MSec: Word): TDateTime;

Description

La fonction EncodeTime renvoie une valeur de type TDateTime à partir des paramètres Hour, Min, Sec et MSec. Les valeurs admises pour Hour vont de 0 à 12, pour Min et Sec de 0 à 59. MSec doit être comprise entre 0 et 999. Si les valeurs indiquées sont en-dehors de ces limites, une exception EConvertError est déclenchée.

La valeur résultante est égale à un nombre compris entre 0 (inclusif) et 1 (exclusif) qui indique la partie fractionnaire du jour en fonction de l'heure indiquée. La valeur 0 correspond à minuit, 0.5 correspond à midi, 0,75 correspond à 18:00, et ainsi de suite.

-------------------------------------------

DecodeTime scinde TDateTime en heures, minutes, secondes et millisecondes.

Unité

SysUtils

Catégorie

routines de dates et d'heures

procedure DecodeTime(Time: TDateTime; var Hour, Min, Sec, MSec: Word);

Description

La procédure DecodeTime sépare la valeur spécifiée par Time en heures, minutes, secondes et millisecondes.

--------------------------------

Time renvoie l'heure système.

Unité

SysUtils

Catégorie

routines de dates et d'heures

function Time: TDateTime;

Description

La fonction Time renvoie l'heure en cours.

---------------------------

Now renvoie la date et l'heure système.

Unité

SysUtils

Catégorie

routines de dates et d'heures

function Now: TDateTime;

Description

La fonction Now renvoie la date et l'heure en cours, ce qui équivaut à Date + Time.

------------------------------------

DateTimeToStr convertit une variable de type TDateTime en chaîne.

Unité

SysUtils

Catégorie

routines de dates et d'heures

function DateTimeToStr(DateTime: TDateTime): string;

Description

La fonction DateTimeToStr convertit une variable de type TDateTime en chaîne. Si le paramètre DateTime ne contient pas de valeur date, la date affichée sera 00/00/00. Si le paramètre DateTime ne contient pas de valeur horaire, l'heure affichée sera 00:00:00 AM. Vous pouvez changer le format de la chaîne en modifiant certaines des constantes type date/heure.

________________________________


TDateTime est le type utilisé par les routines date et heure afin de pouvoir conserver des valeurs date et heure.

Unité

System

type TDateTime = type Double;

Description

Delphi conserve les valeurs date et heure dans un type TDateTime. La partie entière d'une valeur de type TDateTime représente le nombre de jours depuis le 12/30/1899. La partie fractionnaire d'une valeur de type TDateTime est la partie des 24 heures écoulée.

Voici quelques exemples de valeurs de type TDateTime suivis de la date et de l'heure correspondantes :

0 12/30/1899 12:00 am
2.75 1/1/1900 6:00 pm
-1.25 12/29/1899 6:00 am
35065 1/1/1996 12:00 am
Pour trouver le nombre fractionnaire de jours entre deux dates, il suffit de soustraire les deux valeurs. De même, pour incrémenter une valeur date et heure d'un nombre fractionnaire, il suffit d'ajouter ce nombre à la valeur date et heure.

Remarque

Delphi 1.0 calculait la date depuis l'an 1 et non depuis l'an 1899. Pour convertir une date Delphi 1.0 en date Delphi 2.0, il faut soustraire 693594,0 de la date Delphi 1.0. Le format de date a été modifié pour une meilleure compatibilité avec l'automation OLE 2.0.

--------------------------------------



TTimeStamp représentes des valeurs date-heure.

Unité

SysUtils

type

TTimeStamp = record
Time: Integer; { Nombre de millisecondes depuis minuit }
Date: Integer; { Un plus nombre de jours depuis 1/1/0001 }

end;

Description

Utilisez TTimeStamp pour représenter des valeurs date-heure quand une grande précision est nécessaire dans la partie horaire. Quand les valeurs horaires n'ont pas besoin d'être précises à la milliseconde près, utilisez la représentation TDateTime qui est plus compacte.

TTimeStamp est un enregistrement contenant un champ Time qui représente le nombre de millisecondes écoulées depuis minuit et un champ Date représentant le nombre de jours calendaires écoulés depuis le début du calendrier.

-----------------------------------------


DateTimeToTimeStamp convertit une valeur TDateTime en valeur TTimeStamp.

Unité

SysUtils

Catégorie

routines de dates et d'heures

function DateTimeToTimeStamp(DateTime: TDateTime): TTimeStamp;

Description

Appelez DateTimeToTimeStamp pour convertir une valeur TDateTime en valeur TTimeStamp. Les valeurs TDateTime représentent l'heure sous forme du nombre de jours (y compris les jours non entiers) échus depuis le 30 décembre 1899 à midi. Les valeurs TTimeStamp représentent l'heure sous la forme d'une date et d'une heure , où la date est le nombre de jours écoulés depuis le début du calendrier en cours (le 1er janvier 0001 aurait la valeur 1) et l'heure est le nombre de millisecondes écoulées depuis minuit.

-------------------------------------


TimeStampToDateTime convertit une valeur TTimeStamp en valeur TDateTime.

Unité

SysUtils

Catégorie

routines de dates et d'heures

function TimeStampToDateTime(const TimeStamp: TTimeStamp): TDateTime;

Description

Appelez TimeStampToDateTime pour convertir une valeur TTimeStamp en valeur TDateTime. Les valeurs TTimeStamp représentent l'heure en séparant la date et l'heure, où la date est le nombre de jours calendaires écoulés depuis le début du calendrier actuel (le premier janvier 0001 aurait la valeur 1), et l'heure est le nombre de millisecondes depuis minuit. Les valeurs TDateTime représentent l'heure comme le nombre de jours écoulés depuis le 30 décembre 1899 à midi.


Et j'en ai peut être oublié ....

Ca devrait suffire non ?



@+
Philippe




[[  The Truth is Out There   ]]
1
C pa une solution de faire ca, C a dire convertir , soustraire et tt ce trimbalin.
Je déconnecte tt de suite, je prendrai un stylo et papier, j essayerai de faire tourner ca à la main; je te donnerai la solution aprés ok?
Mais la je vais juste te donner l algorithme ou le principe, car j ai jamais travaillé avec delphi ok??
0
En fait le 12/30/1899 12:00 am correspond à 0 et 1/1/1996 12:00 am à 35065.
C pour ça que je pensais pouvoir convertir les 2 dates, les soustraires et convertir le résultat dans l'autre sens !...
(Je crois l'avoir déjà fait, mais je suis pas sûr que c'était avec Delphi !...)

Merci à toi...
0
Salut me revoilà ;
Ouai je crois que la conversion serait la solution optimale pour cet algo :--).
Voici ce que je te propose, si tu connais pas la notion d enregistrement, tu pourrai saisir tes dates dans un tableau oubien ts simplement tu les saisis dans des variables distinctes ( par exemple jour1, mois1, année1…)


ALGORITHME
ENVIRONNEMENT
-Type : t_date : enregistrement décrivant une structure de données de la forme
Jour : entier
Mois : entier
Année : entier

Date1, date2 : de type t_date qui sont les 2dates à saisir en entrée.
Cumul1, cumul2 : variables intermédiaires, servira de cumul de conversion des dates en jours.
Diff : C le résultat, nbre de jour entre les deux dates (date2-date1)
i et k sont des variables intermédiares
DEBUT :
Lire(date1.jour)
Lire(date1.mois)
Lire(date1.année)
Lire(date2.jour)
Lire(date2.mois)
Lire(date2.année)
Cumul1ßdate1.jour
Cumul2ßdate2.jour


Pour i de 0 à date1.mois faire
Si i=1,3,5,7,8,10,12 alors cumul1ßi*31 + cumul1
Sinon si i=4,6,9,11 alors cumul1ßi*30+cumul1
Sinon /***LA il faudrai envisager deux cas, si l année est bixestil ou pas pour le mois de fevrier !!!!*/

Fin pour


Cumul1ßcumul1+date1.année*(7*31+4*30+29) /29 ou 28 ca dépend de l année !!)

/*On refait la même chose pour la 2iéme date*/
Pour i de 0 à date2.mois faire
Si i=1,3,5,7,8,10,12 alors cumul2ßi*31 + cumul2
Sinon si i=4,6,9,11 alors cumul2ßi*30+cumul2
Sinon /***LA il faudrai envisager deux cas, si l année est bixestil ou pas pour le mois de fevrier !!!!*/

Fin pour


Cumul2ßcumul2+date2.année*(7*31+4*30+29) /29 ou 28 ca dépend de l année !!)


Diffßcumul2-cumul1
FIN


Voilà J espére que ca va te simplifier ta tâche, N hésite pas à me contacter en cas d incompréhesion.
Bon Travail
0
Grand merci à toi ! Je suis vraiment touché d'un tel dévouement de ta part. Encore merci, et si tu as un problème sur Delphi et ses bases de données, je serait heureux de pouvoir d'aider...

A+.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Marden Messages postés 1072 Date d'inscription dimanche 11 février 2001 Statut Membre Dernière intervention 29 janvier 2006 208
4 mars 2002 à 01:10
Pour ma part, j'utilise une méthode qui consiste à compter le nombre de jours écoulés depuis 31/12/0000, selon le calendrier julien, mais en ignorant le passage (en France) du Dim 09/12 au Lun 20/12/1582, en cumulant :
- les groupes de 4 siècles (x 146097 jours, ex : an 0001 à 1600),
- puis, dans ce qui reste, les siècles (x 146097 jours, ex : an 1601 à 1900),
- puis les groupes de 4 ans (x 1461 jours, ex : an 1901 à 1996),
- puis les années (x 365 jours, ex : 1997 à 1999),
- puis le quantième de l'année (avec 2 tables de cumul en jours pour les mois des années bissextile et non bissextile)
0
jisisv Messages postés 3645 Date d'inscription dimanche 18 mars 2001 Statut Modérateur Dernière intervention 15 janvier 2017 934
4 mars 2002 à 04:33
Pour rire, il n'existe pas de fonction fournie par l'environnement.
Si on convertit les dates en teps système genre unix il doit y avoir moyen de se tirer d'affaire..
http://www.mcsr.olemiss.edu/cgi-bin/man-cgi?time+2
(fait une recherche sur google)
BSi Delphi ne fournit pas les fonctionnalités ce n'est plus mes oignons...

Johan Daine
0
Orel j éspére que Ca t a vraiment aidé ce que je t ai proposé.
Qu est ce que tu fais comme etudes?
0
Salut Kiddo !

En fait g trouvé une solution simple, et j'aime pas trop me comploiquer la vie alors... quoi que ton algo avait l'air assez logique mais le mien tien en 2 lignes ! alors...

Tu me demande ce que g fait comme études : BTS Informatique de Gestion (développeur d'applications.) Et toi ?


Voilà ! A+.
(Ps : Kiddo : quel drôle de surnom ?)
0
Merci bcp PhP pour ces brèves explications !!...
Mais g déjà trouvé une soluce simple :

var
Dif: extended;

begin

Dif := Now - StrToDate('15/01/2002');
lblDuree.Caption := '(' + floattostr(Round(Dif)) + ' jours )';

end;
0
Salut Kiddo !

En fait g trouvé une solution simple, et j'aime pas trop me compliquer la vie alors... quoi que ton algo avait l'air assez logique mais le mien tien en 2 lignes ! alors...

Tu me demande ce que g fait comme études : BTS Informatique de Gestion (développeur d'applications.) Et toi ?


Voilà ! A+.
(Ps : Kiddo : quel drôle de surnom ?)
0
wwaw de l Informatique appliquée Gestion ca doit être interessant.
Moi je fais des études dans les Réseaux Informatiques et Télecommunications.
;)
0
Ouias c pas mal, mais y a pas que de la gestion, y aussi de la création de sites internet, de l'architecture matérielle, de l'analyse (bases de données, mcd, mld), algo, asp etc... voilà...
0
Moi je viens juste de débuter cette année dans les bases de données, Tu pourrai pe etre m aider alors :)?!
J é déja posé une question sur ca dans ce forum:Pk est ce qu on doit faire un cahier de charge avant la création de la BD?
Prends soin de toi é Bon travail
0
Pas de problème ! Si tu as besoin d'un coups de main, je veux bien essayer de t'aider...
0
Mé T é tjs connecté ou koi :)
Ou est ce que T?
0
C simple j'ai l'ADSL, alors tu vois je peut me permettre et je dois dire que j'en suis plutôt content !... ça a pas l'air d'être ton cas !
0
O c bien ca, T a vrémen de la chance ;).
Moi non chui chez moi, je connecte bcp, é C payant en plus C un pe couteux...
Voilà:)
0
Salut à tous ;-)

J'arrive avec 3 ans de retard mais bon...
Je cherchais une fonction Delphi qui retourne le nombre de secondes écoulées entre 2 dates et puis j'ai rien trouvé mais je suis tombé sur ce forum !
Je vous fait donc partager la petite fonction que je viens de terminer qui à mon avis est beaucoup plus simple que celles développées plus haut :

function CalculDureeEntreDates(DateF,DateO:TDateTime):int64; // en seondes
var DateTmp:TDateTime;
Jours,Secondes:integer;
begin
if DateF > DateO then
begin
DateTmp:=DateF-DateO;
Secondes:=trunc(DateTimeToTimeStamp(DateTmp).Time/1000);
Jours:=DateTimeToTimeStamp(DateTmp).Date -DateDelta;
CalculDureeEntreDates:=Jours*86400+Secondes
end
else // sinon risque de beug du fait que le nb de jours est signé tandis que secondes ne l'est apparement pas...
begin
CalculDureeEntreDates:=0;
end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
showmessage(inttostr(CalculDureeEntreDates(StrToDateTime('13/04/2005 12:32:22'),StrToDateTime('12/03/2005 11:32:22'))));
end;


A++
TheCogitor
0
avec ce problème, vous serrez obligé de faire une requête en programmation soit en ACCESS ou en VB comme bon vous semble
0
Olivier Dabazach
18 avril 2005 à 08:16
Bonjour !

En ce qui concerne votre problème de calcul de secondes entre deux dates, il y a une fontion :

SecondsBetween(const ANow, AThen: TDateTime): Int64;
qui renvoie le nombre de secondes écoulées entre deux dates et qui nécessite d'ajouter DateUtils à la clause uses en début d'unité :

Uses Windows ....... , DateUtils;

Tapez SecondsBeetween, appelez l'aide et vous pourrez lister l'ensemble des fonctions de l'unité DateUtils qui est une mine !
0
Eh les boulets DaysBetween(Date2,Date1); suffit en delphi... mm avec le 5 !
0
houbie Messages postés 34 Date d'inscription samedi 18 août 2007 Statut Membre Dernière intervention 12 février 2013 2
26 mars 2008 à 10:18
Bonjour,
vous avez pas de solution pour j script ? c'est urgent et merci d'avance
0
issambh Messages postés 3 Date d'inscription lundi 31 mars 2008 Statut Membre Dernière intervention 1 avril 2008
31 mars 2008 à 09:28
Bonjourà tous...
j'ai un probleme avec excel , j'ai un fichier (.dbf) qui s'ouvre avec excel mais qui affiche la dtae et l'heure dans une meme cellule sous la forme suivante: 20080306073441046
il n y a pas une methode pour séparer l'heure et la date et qu'is soient sous le format suivant:
06/03/2008
07:34:41046
0