Avatar billede morten_s Nybegynder
06. februar 2002 - 09:08 Der er 8 kommentarer og
1 løsning

StringToDate konvertering

Jeg har en datostreng som altid ser ud sådan her

06-02-02 for f.eks idag den 6.februar 2002
strengen ønskes konverteret til en TDate
til dette formål har jeg brugt følgende
var
  DatoTDate : TDate;
  DatoStr  : String;

DatoStr := '06-02-02' //kommer ind fra en PLC via RS232
DatoTDate := StrToDate(DatoStr);

Dette fungere fint på min maskine hvor ShortDate er sat op til dd-mm-yy, nu er programmet imidlertid blevet installeret på en maskine i Sverige hvor datoformatet er yy-mm-dd, så står der pludselig 2006-02-02 i DBGridne, hvordan sikre jeg mig at det fungere på alle maskiner uanset datoformat ?
Avatar billede martinlind Nybegynder
06. februar 2002 - 09:26 #1
Du sætter ShortDate variablen til det format du gerne vil køre med når du starter dit program
Avatar billede morten_s Nybegynder
06. februar 2002 - 09:31 #2
Hvad så med alle andre programmer, vil de ikke blive påvirket af dette ?
Avatar billede snowball Novice
06. februar 2002 - 09:33 #3
Eks.:

var
  Format: String;
begin
  Format := ShortDateFormat; //Hent format fra lokal PC
  if Format <> 'dd-MM-yyyy' then //Lav det om hvis det er anderledes end det vi ønsker
    ShortDateFormat := 'dd-MM-yyyy';

  //Din kode !

  if Format <> ShortDateFormat then //Tilbage til org. hvis vi har ændret det
    ShortDateFormat := Format;
end;

Snowball
Avatar billede snowball Novice
06. februar 2002 - 09:34 #4
Morten_s: Jo, det er derfor klogt kun at ændre det mens du har brug for det. Li'som jeg lige har vist :)

Snowball
Avatar billede hreiff Nybegynder
06. februar 2002 - 09:37 #5
Du kan bruge StrToDateTime
Den bruger såvidt jeg ved altid formatet mm/dd/yy hh:mm:ss
og du kan så bruge DecodeDate på resultatet.
Det kræver naturligvis at du bytter om på mm og dd og tilføjer et tilfældigt tidspunkt.
Ombytning:
NyFormat=copy(GlString,4,2)+'/'+copy(GlString,1,2)+'/'+copy(GlString,7,2);
Husk at yy med to tal giver et årstal mellem 1900 og 1999

Ellers må du ind og læse variablen 'ShortDateFormat'


Det nemmeste er nok:

GlDateFormat := ShortDateFormat;
NewDate := insert('20',DatoStr,7); (*ændrer format til 06-02-2002*)
ShortDateFormat := 'dd-mm-yyyy';  (*Så er man sikker på året*)
DatoTDate := StrToDate(NewDate);
ShortDateFormat := GlDateFormat;  (*Ændrer tilbage til det oprind.*)
Avatar billede dp142 Nybegynder
06. februar 2002 - 10:10 #6
DecodeDate(Present, Year, Month, Day);så virker det

Så er alle problemer løst

Dennis
Avatar billede martinlind Nybegynder
06. februar 2002 - 10:17 #7
Det er kun for din aktuelle app., du kan læse mere i hjælpen
Avatar billede morten_s Nybegynder
06. februar 2002 - 10:24 #8
dp142> DecodeDate vender den forkerte vej, jeg har Year, Month, Day i 3 strenge og skal have en sikker konvertering til en TDate
Avatar billede morten_s Nybegynder
06. februar 2002 - 10:39 #9
Sådan her skal det gøres EncodeDate er den rigtige

TimeStr := Copy(TmpStr, 21, 2)+':'+Copy(TmpStr, 24, 2)+':'+Copy(TmpStr, 27, 2);
        DateStr := Copy(TmpStr, 12, 2)+'-'+Copy(TmpStr, 15, 2)+'-'+Copy(TmpStr, 18, 2);
        dd := StrToInt(Copy(TmpStr, 12, 2));
        MM := StrToInt(Copy(TmpStr, 15, 2));
        yyyy := StrToInt('20'+Copy(TmpStr, 18, 2));
        DatoDate := EncodeDate(yyyy, MM, dd);
        Insert;
        FieldByName('IntId').AsInteger := IdSelectedInt;
        FieldByName('AlDate').AsDateTime :=  DatoDate;

Tak til dp142 som burde have haft pointene
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester