begin process at 2012 02 11 02:36:53
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Date & Heure

 > CONVERTION D'UNE CHAINE EN TDATE

CONVERTION D'UNE CHAINE EN TDATE


 Information sur la source

Note :
Aucune note
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 :4 856

Auteur : barbichette

Ecrire un message privé
Site perso
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...

 Sources du même auteur

Source avec Zip Source avec une capture COMPARATIF ALGO CERCLES
Source avec Zip Source avec une capture INTERPRETEUR DE LANGAGE PERSONNALISABLE BIS
Source avec Zip Source avec une capture INTERPRETEUR DE LANGAGE PERSONNALISABLE
Source avec Zip Source avec une capture RUBIK'S CUBE
Source avec Zip Source avec une capture SPINEDIT EN DÉCIMAL AVEC GESTION DES UNITÉS

 Sources de la même categorie

Source avec Zip Source avec une capture SIMPLE HORLOGE ANALOGIQUE par hamza
Source avec Zip Source avec une capture MÉMO V1.0.0 par Christophe67
Source avec Zip Source avec une capture AGENDA HEBDO par dubois77
Source avec Zip Source avec une capture PAQUES 1.0.0 par Christophe67
Source avec Zip Source avec une capture TIMESERVER V1.0.3 par Christophe67

 Sources en rapport avec celle ci

Source avec Zip Source avec une capture SIZECONVERTER : UNE MINI LIBRAIRIE DE CONVERSION DE TAILLE par LaDentDeLait
Source avec Zip Source avec une capture TIMESERVER V1.0.3 par Christophe67
Source avec Zip Source avec une capture MODIFIER LES DATES DE CRÉATION, DE MODIFICATION ET DE DERNIE... par ni69
DATE EN ARABE par AITFRAH1
Source avec Zip Source avec une capture BARRE UTILITAIRE par ced55957

Commentaires et avis

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+

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

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

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

Commentaire de MAURICIO le 29/02/2008 13:01:27 administrateur CS

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

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

Commentaire de MAURICIO le 29/02/2008 14:41:51 administrateur CS

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

Février 2012
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
272829    

Consulter la suite du CalendriCode

 
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

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 2,246 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales