Kezdőoldal » Számítástechnika » Programozás » Free Pascal: dátumkezeléssel...

Free Pascal: dátumkezeléssel kapcsolatos hiba megoldása? (bővebben lent)

Figyelt kérdés

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.



2020. márc. 13. 17:45
 1/7 A kérdező kommentje:

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.

2020. márc. 13. 19:43
 2/7 tabaki ***** válasza:

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:

[link]

2020. márc. 14. 00:25
Hasznos számodra ez a válasz?
 3/7 tabaki ***** válasza:

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.

2020. márc. 14. 00:38
Hasznos számodra ez a válasz?
 4/7 tabaki ***** válasza:

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.

2020. márc. 14. 01:21
Hasznos számodra ez a válasz?
 5/7 A kérdező kommentje:

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.

2020. márc. 14. 05:29
 6/7 tabaki ***** válasza:

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.

2020. márc. 14. 07:57
Hasznos számodra ez a válasz?
 7/7 A kérdező kommentje:

Mindegyik megvalósításod jobb-praktikusabb-esztétikusabb mint az enyém.

Köszi hogy foglalkoztál a dologgal.

2020. márc. 14. 08:48

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

A weboldalon megjelenő anyagok nem minősülnek szerkesztői tartalomnak, előzetes ellenőrzésen nem esnek át, az üzemeltető véleményét nem tükrözik.
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!