Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

CONVERTION D'UNE CHAINE EN TDATE


Information sur la source

Catégorie :Date & Heure Classé sous : date, convertion, multiformat Niveau : Débutant Date de création : 05/09/2007 Date de mise à jour : 07/09/2007 10:40:02 Vu : 3 542

Note :
Aucune note

Commentaire sur cette source (7)
Ajouter un commentaire et/ou une note

Description

converti une chaine de caractère en TDate, comme StrToDate, mais fonctionne un peu comme dans Access.
Elle prend en charge les chaines contenants une date au format suivant :
- un jour, un mois et une année séparée par un caractère quelconque (comme un espace ou un slash)
- JJ, JJMM, JJMMAA ou JJMMAAAA sans rien entre
Le mois peut-être écrit en lettre ou en chiffre.
Dans le cas où il manque le mois ou l'année, il prend la date actuelle pour compléter la date
Ainsi on peut saisir :
04/09/07, 040907, 4 9 2007, 04 septembre 07, 4 sep 2007 ou encore 04sep07

J'ai mis 'mars' au lieu de 'mar' pour ne pas avoir de bugs si l'utilisateur tape le jour de la semaine en plus.
Ainsi, 'mardi 05 sep 07' renvois bien 05/09/07 même si en vérité c'est un mercredi.

Il me semble pas y avoir de bug...
 

Source

  • Uses DateUtils, StrUtils, SysUtils;
  • //------------------
  • function countcar(s:string;c:char):integer;
  • var
  • i:integer;
  • begin
  • result:=0;
  • for i:=1 to length(s) do if s[i]=c then inc(result);
  • end;
  • //------------------
  • Function MyStrtoDate(mydate:string):tdate;
  • const
  • mois:array[1..12] of string=('jan','fev','mars','avr','mai','juin','juil','aou','sep','oct','nov','dec');
  • var
  • i:integer;
  • j,m,a:word;
  • begin
  • result:=-1;
  • mydate:=ansilowercase(mydate);
  • // récup la date courante
  • decodedate(date,a,m,j);
  • //retire les accents pour décembre, août, février
  • while pos('é',mydate)<>0 do mydate[pos('é',mydate)]:='e';
  • while pos('û',mydate)<>0 do mydate[pos('û',mydate)]:='u';
  • // remplace les mois en lettres par des mois en chiffres
  • for i:=1 to 12 do
  • if pos(mois[i],mydate)<>0 then
  • begin
  • insert(' '+inttostr(i)+' ',mydate,pos(mois[i],mydate));
  • delete(mydate,pos(mois[i],mydate),length(mois[i]));
  • break;
  • end;
  • // retire tous ce qui n'est pas des chiffres et remplace par un espace
  • i:=1;
  • for i:=1 to length(mydate) do if not (mydate[i] in ['0'..'9',' ']) then mydate[i]:=' ';
  • // retire les doubles espaces
  • while pos(' ',mydate)<>0 do delete(mydate,pos(' ',mydate),1);
  • mydate:=trim(mydate);
  • // il n'y a plus rien... on sort
  • if mydate='' then exit;
  • // si il n'y a pas d'espace, alors c'est la forme JJMMAA
  • case countcar(mydate,' ') of
  • 0:
  • case length(mydate) of
  • 2: mydate:=mydate+'/'+inttostr(m) +'/'+inttostr(a);
  • 4: begin insert('/',mydate,3); mydate:=mydate+'/'+inttostr(a); end;
  • 6,8: begin insert('/',mydate,5); insert('/',mydate,3); end;
  • end
  • 1: mydate:=mydate+'/'+inttostr(a);
  • end;
  • //remplace les espaces par des '/'
  • while pos(' ',mydate)<>0 do mydate[pos(' ',mydate)]:='/';
  • //verif et renvoi au format TDate
  • if not TryStrToDate(mydate,result) then result:=-1;
  • end;
Uses DateUtils, StrUtils, SysUtils;

//------------------

function countcar(s:string;c:char):integer;
var
 i:integer;
begin
 result:=0;
 for i:=1 to length(s) do if s[i]=c then inc(result);
end;

//------------------

Function MyStrtoDate(mydate:string):tdate;
const
mois:array[1..12] of string=('jan','fev','mars','avr','mai','juin','juil','aou','sep','oct','nov','dec');
var
 i:integer;
 j,m,a:word;
begin
 result:=-1;
 mydate:=ansilowercase(mydate);
 // récup la date courante
 decodedate(date,a,m,j);
 //retire les accents pour décembre, août, février
 while pos('é',mydate)<>0 do mydate[pos('é',mydate)]:='e';
 while pos('û',mydate)<>0 do mydate[pos('û',mydate)]:='u';
 // remplace les mois en lettres par des mois en chiffres
 for i:=1 to 12 do
  if pos(mois[i],mydate)<>0 then
   begin
    insert(' '+inttostr(i)+' ',mydate,pos(mois[i],mydate));
    delete(mydate,pos(mois[i],mydate),length(mois[i]));
    break;
   end;
 // retire tous ce qui n'est pas des chiffres et remplace par un espace
 i:=1;
 for i:=1 to length(mydate) do  if not (mydate[i] in ['0'..'9',' ']) then mydate[i]:=' ';
 // retire les doubles espaces
 while pos('  ',mydate)<>0 do delete(mydate,pos('  ',mydate),1);
 mydate:=trim(mydate);
 // il n'y a plus rien... on sort
 if mydate='' then exit;
 // si il n'y a pas d'espace, alors c'est la forme JJMMAA
 case countcar(mydate,' ') of
 0:
  case length(mydate) of
   2: mydate:=mydate+'/'+inttostr(m) +'/'+inttostr(a);
   4: begin insert('/',mydate,3); mydate:=mydate+'/'+inttostr(a); end;
   6,8: begin insert('/',mydate,5); insert('/',mydate,3); end;
  end
 1: mydate:=mydate+'/'+inttostr(a);
 end;
 //remplace les espaces par des '/'
 while pos(' ',mydate)<>0 do mydate[pos(' ',mydate)]:='/';
 //verif et renvoi au format TDate
 if not TryStrToDate(mydate,result) then result:=-1;
end;

Historique

06 septembre 2007 11:36:04 :
Modification pour tenir compte des remarques de Loda - Rajout de la fonction CountCar que j'avait oublié de mettre...
06 septembre 2007 11:37:00 :
Modification pour tenir compte des remarques de Loda - Rajout de la fonction CountCar que j'avait oublié de mettre...
07 septembre 2007 10:40:02 :
correction d'un petit bug...

Commentaires et avis

signaler à un administrateur
Commentaire de Loda le 06/09/2007 09:14:34

salut,

sans l'avoir testé, je voulais te signaler un point important, utilise un buffer pour "now". pour deux raisons:
1. vitesse
2. cohérence. imagine que j'appelle ta méthode le 31 dec à 11h59 59'. que peut il se passer? (Si tu pense le risque minime, je te rappel que win est multitâche et que tu ne peux pas contrôler la préemption.)

sinon, si tu utilises DecodeDate, tu peux aussi éviter des appels inutiles (regarde l'implementation de MonthOf)

aussi, prefère "date" à "now" un poil plus rapide. (de nouveau regarde l'implémentation.)

A+

signaler à un administrateur
Commentaire de cirec le 06/09/2007 14:50:08 administrateur CS

Salut,

comme loda je n'ai pas testé le code mais j'ai quand même une petite remarque a faire ... ;-)
l'écriture des dates étant normalisée et prévue dans Delphi ...

ton tableau "Mois" est inutile puisque dans l'unité System y sont déclarés les tableaux suivants :
  ShortMonthNames: array[1..12] of string;
  LongMonthNames: array[1..12] of string;
  ShortDayNames: array[1..7] of string;
  LongDayNames: array[1..7] of string;

et le tout tien compte du langage système

@+
Cirec

signaler à un administrateur
Commentaire de barbichette le 06/09/2007 18:33:10

Salut,
Merci pour ces infos, cependant, je vais garder mon tableau pour la raison suivante:
- il contient les mois sans accents...
Mais il est vrai qu'on pourrai utiliser ShortMonthNames ou LongMonthNames, mais dans ce cas, l'utilisateur doit saisir avec accents... Pourquoi pas...

Barbichette

signaler à un administrateur
Commentaire de Loda le 07/09/2007 09:16:17

salut,

en ajoutant mon grain de sel : tu peux aussi utiliser le tableau system et enlever les accents (mais dans ce cas pense au autre langue que le FR)

bon code,

Loda

signaler à un administrateur
Commentaire de MAURICIO le 29/02/2008 13:01:27

Salut FormatDateTime est pas mal dans son genre et permet de personaliser la sortie.
A+

signaler à un administrateur
Commentaire de barbichette le 29/02/2008 13:28:34

Salut,
Il me semble que FormatDateTime convertis une TDateTime en string et non l'inverse...
Ou alors, je ne connais pas tous ses secrets...

Barbichette

signaler à un administrateur
Commentaire de MAURICIO le 29/02/2008 14:41:51

Effectivement, je repars me coucher ...

Ajouter un commentaire

Discussions en rapport avec ce code source dans le forum

Convertion adresse [ par Jakouz ] Helloje ne sais pas s'il existe en delphi une function qui convertisse une adresse HTTP d'un dossier (ou d'un fichier) en une adresse ABSOLUE ... du s probleme de date [ par Kal ] j'aimerais savoir si il est possible de faire des operations sur les Tdatetime si oui leskelles et keske ca donne?est ce ke si je fais la difference d StatusBar? [ par jia2812 ] Salut les progs'!...Mon pb est tout bête, mais... C'est la 1ère fois que je me sers du contrôle StatusBar. Alors je colle évidemment au niveau des Te Requete sql DATE ??? [ par Technoman ] Dans un tQuery, je cherche a faire une recherche avec comme critere de recherche une date :select *from Tablewhere Datetable=???;Le ??? ne marche pas Date : comment extraire le jour de la semaine ? [ par DAR ] La fonction "DecodeDate" retourne le jour, le mois et l'année d'une date, mais comment faire pour connaitre le jour de la semaine correspondant : lund date et heure d'un fichier [ par JCLK ] salut à tousJe voudrais savoir comment récupérer la date et l'heure de modification d'un fichier.merci beaucoup formater une date [ par pasoif ] comment pourrai-je formater une chaine du type: mardi. 09 avril. 2002 en un format date valide (integer ou tdatetime) ? je galere dessus depuis plus Afficher date littérale? [ par Stephanie ] Bonjour,Je suis débutante en Delphi. Je dois créer un petit prog qui me permettra d'afficher une date entrée au clavier de format numérique et l'affic contrôle de validité d'une date - algo [ par manudel ] Je dois faire un contrôle de validité sur un champ date, avant de faire un commit sur un enregistrement. Je dispose de 3 champs : - un id - un champ n changement de la bd de reference [ par choup ] Quelque chose de bizarre pour moi :j'ai un formulaire qui a un objet "requete" : QTravaux qui utilise comme bd "travaux" et je voudrai remplacer la bd


Nos sponsors

Sondage...

CalendriCode

Juillet 2009
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Téléchargements

Logiciels à télécharger sur le même thème :

Comparez les prix Nouvelle version


LG KP501

Entre 9€ et 159€


Photothèque Nouveau !



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,437 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.