Free Pascal: dátumkezeléssel kapcsolatos hiba megoldása? (bővebben lent)
Van jópár dátum, melyeket szeretnék átalakítani. Döbbenten tapasztaltam, hogy a "ShortDateFormat" is "deprecated", a DateSeparator és TimeSeparator is.
Sőt, maga a StrToDateTime bemutatására íródott példaprogram is hibával akad ki, azonnal.
Én ilyen dátumokat szeretnék átalakítani (de másodpercek nélkül):
2019.02.22 20:27
Ilyen dátumokat szeretnék tárolni a TDateTime változóban.
A fent említettek helyett került valami bevezetésre Free Pascal-ban? Én jelenleg a 3.0.4 változatot használom.
A kódot nem én írtam, tehát a "kisbetű-nagybetű helytelen használatáról" nem én tehetek.
Program Example20;
{ This program demonstrates the StrToDateTime function }
Uses sysutils;
Procedure TestStr (S : String);
begin
Writeln (S,' : ',DateTimeToStr(StrToDateTime(S)));
end;
Begin
Writeln ('ShortDateFormat ',ShortDateFormat);
TestStr(DateTimeToStr(Now));
TestStr('05-05-1999 15:50');
TestStr('5-5 13:30');
TestStr('5 1:30PM');
End.
DateSeparator és TimeSeparator alapértelmezett de hiába... :-(
program datumtesztelo_nemmukodik;
uses SysUtils;
var
dt : TDateTime;
ds : string;
begin
WriteLN('DateSeparator: ',DateSeparator,' TimeSeparator: ',TimeSeparator);
dt := Now;
WriteLn(datetimetostr(dt));
ds := '2020.03.13. 19:30:36';
{$i-}
dt := StrToDateTime(ds);
{$i+}
if IOResult <>0 then WriteLn('Hiba ',ds,' konvertalasakor');
ds :='2020. 03. 13. 19:30:36';
{$i-}
dt := StrToDateTime(ds);
{$i+}
if IOResult <>0 then WriteLn('Hiba ',ds,' konvertalasakor');
ReadLn;
end.
program datumtesztelo_mukodik;
uses SysUtils;
var
dt : TDateTime;
ds : string;
begin
WriteLN('DateSeparator: ', DefaultFormatSettings.DateSeparator,
' TimeSeparator: ', DefaultFormatSettings.TimeSeparator);
dt := Now;
ds := datetimetostr(dt);
WriteLn('Mostani dátum és idő: ', DateTimeToStr(dt));
ds := '14-3-20 01:28:36';
dt := StrToDateTime(ds);
WriteLn('Ekkor írta a programot tabaki: ', DateTimeToStr(dt));
ReadLn;
end.
A manual itt említi a deprecated-státust, és küld is tovább az új módit bemutató lapra:
A szeparátorok megváltoztatásával:
program datumformazo;
uses SysUtils;
var
dt : TDateTime;
ds : string;
begin
DefaultFormatSettings.DateSeparator := '/';
DefaultFormatSettings.TimeSeparator := '.';
WriteLN('DateSeparator: ', DefaultFormatSettings.DateSeparator,
' TimeSeparator: ', DefaultFormatSettings.TimeSeparator);
dt := Now;
ds := datetimetostr(dt);
WriteLn('Mostani dátum és idő: ', DateTimeToStr(dt));
ds := '14/3/20 01.39.33';
dt := StrToDateTime(ds);
WriteLn('Ekkor írta a programot tabaki: ', DateTimeToStr(dt));
ReadLn;
end.
Ja, bocs, nem a te elképzelésednek megfelelően állítottam be a szeparátorokat, de ezzel az embert próbáló feladattal nyilván meg fogsz birkózni...
Egyébként lehet, hogy az én fordítóm már régi, de a lejárt szavatosságú változókat is hagyja még átállítani csupaszon, a „DefaultFormatSettings.” nélkül. Mindent összevetve: A programod egyetlen lényeges hibája az volt, hogy nem mondtad meg neki, hogy DateSeparatorként ezentúl pontot szeretnél a kötőjel helyett.
Ha lassacskán is, de apránként leszivárog az elmém fenekére minden cseppje annak, hogy mit szeretnél, úgyhogy mutatok mást, remélem, ez már minden részletében klappol:
uses SysUtils;
var most : TDateTime;
begin
most := Now;
WriteLn ('Most ez van: ',FormatDateTime('YYYY.MM.DD hh:nn', most));
WriteLn ('Meg egy pont a datum után: ',FormatDateTime('YYYY.MM.DD. hh:nn', most));
ReadLn;
end.
Nagyon szépen köszönöm a segítséget, a megvalósítást.
a bemásolt két példakódban valóban nem állítottam be a separator-okat, ezért is a kiírás, hogy "az az alapértelmezett".
Megalkottam a működő változatot is, csak addigra már elálmosodtam és elfelejtettem kiírni. Mondjuk elég nyakatekert :-)
program datumtesztelo_nemmukodik;
uses SysUtils;
var
dt : TDateTime;
ds : string;
begin
DateSeparator:= '.';
TimeSeparator := ':';
WriteLN('DateSeparator: ',DateSeparator,' TimeSeparator: ',TimeSeparator);
dt := Now;
WriteLn(datetimetostr(dt));
ds :='2020'+dateseparator+'03'+dateseparator+'13'+dateseparator+' 19'+timeseparator+'30'+timeseparator+'36';
{$i-}
dt := StrToDateTime(ds);
{$i+}
if IOResult <>0 then WriteLn('Hiba ',ds,' konvertalasakor');
ds := DateTimeToStr(dt);
WriteLn(ds);
ReadLn;
end.
Mi tűrés-tagadás, nálam így is hibára fut, ha a ds beállításánál a 2020 helyett nem írok csak 20-at, így:
ds :='20'+dateseparator+'03'+dateseparator+'13'+dateseparator+' 19'+timeseparator+'30'+timeseparator+'36';
Ha a deprecated jelzést is ki akarom küszöbölni, akkor ez lesz a programodból, nyakatekertség ide, nyakatekertség oda:
program datumtesztelo_mukodik2;
uses SysUtils;
var
dt : TDateTime;
ds : string;
begin
DefaultFormatSettings.DateSeparator:= '.';
DefaultFormatSettings.TimeSeparator := ':';
WriteLN('DateSeparator: ',DefaultFormatSettings.DateSeparator,
' TimeSeparator: ',DefaultFormatSettings.TimeSeparator);
dt := Now;
WriteLn(datetimetostr(dt));
ds :=
'20'+DefaultFormatSettings.dateseparator+'03'+
DefaultFormatSettings.dateseparator+'13'+
DefaultFormatSettings.dateseparator+' 19'+
DefaultFormatSettings.timeseparator+'30'+
DefaultFormatSettings.timeseparator+'36';
WriteLn(ds);
{$i-}
dt := StrToDateTime(ds);
{$i+}
if IOResult <>0 then WriteLn('Hiba ',ds,' konvertalasakor');
ds := DateTimeToStr(dt);
WriteLn(ds);
ReadLn;
end.
Mindegyik megvalósításod jobb-praktikusabb-esztétikusabb mint az enyém.
Köszi hogy foglalkoztál a dologgal.
Kapcsolódó kérdések:
Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!