Pascal: beépített eljárásokkal lehet dátumok közt számolni?
Szeretném megoldani, hogy a program az aktuális dátumot lekérve és egy múltbeli dátumot bekérve kiszámolná, hogy hány nap telt el a kettő közt.
Nem kézzel szeretném leprogramozni a szökőévek és egyebek figyelését, mert úgy tudom: vannak erre nagyon jó beépített eljárások.
Amit sikerült kideríteni, azt ide másolom.
elvileg csak ki kell vonni egymásból a két dátumot és eredményt kiírni, de a dátum-bekéréssel is gondban vagyok...
program datumprog;
uses SysUtils, DateUtils;
var
aktualis, masik : TDateTime;
begin
aktualis := Now;
ReadLn(masik);
end.
Dátumot nem tudsz beolvasni közvetlenül. Stringet kell beolvasnod, és azt dátummá konvertálnod: [link]
Ezt olvasgasd.
Pascalban nincs dátum osztály, a TDateTime gyakorlatilag egy alias a double-re.
Nincs dátum tipus. Az eltelt napok számát tárolja, a tizedes pedig az óra,perc, másodperc. pl 2.5 az 1970-01-02 12:00:00. // nem biztos, hogy epoch, lehet mást vesz 0-nak...
Stringből az strtodatetime függvénnyel tudsz parsolni dátumot.
Ha ennél komplexebb dolog kell, keress inkább egy normális dátum implementációt.
Pascalhoz nem értek, de biztosan vannak neten bőven.
A dayspan függvény lesz a barátod. Lásd itt: [link]
De érdemes megnézned az egész dateutils unitot, mert találhatsz benne még olyan függvényt, vagy eljárást, aminek hasznát veszed, illetve a sysutils unitnak is mintha lennének dátumok kezelésére alkalmas alprogramjai. Mind a két unit doksiját megtalálod a neten free pascalhoz.
Ennyi sikerült és valamiért rosszul működik:
uses SysUtils, DateUtils;
var
aktualis,masik : TDateTime;
s : string;
begin
aktualis := Now;
s := '2017.02.11.';
masik := StrToDate(s);
WriteLn(DateTimeToStr(masik-aktualis));
WriteLn(' : ',DaySpan(aktualis,masik));
ReadLn;
end.
Mert nem olvastad el amit linkeltem:
Ha nem olvastam volna el, akkor nem is alkalmaztam volna a StrToDate függvényt...
Aki egyetlen betűt se ír le csak házi megoldását követeli érdekes módon "neki semmit nem kell elolvasni" sőt "gondolkodnia se kell" mert megíródik magától ötezer variációval a házi.
Aki meg el is olvassa és alkalmazza is amit javasoltak neki, ezt kapja.
Érdekes mentalitás.
Tanácsot kértem valakitől, az illető is csak úgy tudta megoldani, hogy saját függvényt írt a stringből történő TDateTime konvertálásra.
Ennek ellenére én megpróbáltam mindenhogyan szabványos módon, de hiába.
"Unhandled Exception" hibaüzenet van.
program datumprog;
uses SysUtils, DateUtils;
var
aktualis, masik, masik2 : TDateTime;
s, s2 : string;
begin
aktualis := Now;
s := '2017.12.11. 11.11.45';
s2 := '2017.12.11. 11:11:45';
masik := StrToDate(s);
masik2 := StrToDate(s2);
WriteLn(DateTimeToStr(masik-aktualis));
WriteLn(DateTimeToStr(masik2-aktualis));
WriteLn(' : ',DaySpan(aktualis,masik));
WriteLn(' : ',DaySpan(aktualis,masik2));
ReadLn;
end.
"The Date must consist of 1 to three digits, separated by the DateSeparator character."
Ott van kerekperec, hogy a külön erre kitalált DateSeparator karaktert kell használnod, nem pontokat írogatnod a számok közé.
És amúgy én sosem írom meg más háziját, a legutolsó alkalommal, mikor kódot írtam egy feladathoz, 4 különböző nyelvet váltogattam, hogy ne tudja lemásolni.
StrToDateTime sem működik.
Gyakorlatilag mindhárom dátum-konvertálásnál kiakad.
program datumprog;
uses SysUtils, DateUtils;
var
aktualis, masik, masik2 : TDateTime;
s, s2, sdatum : string;
begin
aktualis := Now;
s := '2017.12.11 11.11.45';
s2 := '2017.12.11 11:11:45';
sdatum := '11-11-2017 11:30';
masik := StrToDate(s);
masik2 := StrToDate(s2);
masik := StrToDateTime(sdatum);
WriteLn(DateTimeToStr(masik-aktualis));
WriteLn(DateTimeToStr(masik2-aktualis));
WriteLn(' : ',DaySpan(aktualis,masik));
WriteLn(' : ',DaySpan(aktualis,masik2));
ReadLn;
end.
Először az aktualis nevű változót amelybe a dátumot kértem, kiírattam a DateTimeToStr segítségével, pontokat írt, gondoltam: pontokat kell írni.
Egyébként nekem fura módon - karakterekkel se működött ezt is próbáltam.
Mindhárom konvertálási próbálkozás kiakad.
a StrToDateTime-ot tényleg a példából másoltam, csak az évszámokat írtam át.
program datumprog;
uses SysUtils, DateUtils;
var
aktualis, masik, masik2 : TDateTime;
s, s2, s3, sdatum : string;
begin
aktualis := Now;
s := '2017-12-11 11-11-45';
masik := StrToDate(s);
s := '2017-12-11 11:11:45';
masik := StrToDate(s);
sdatum := '11-11-2017 11:30';
masik := StrToDateTime(sdatum);
WriteLn(DateTimeToStr(masik-aktualis));
WriteLn(DateTimeToStr(masik2-aktualis));
WriteLn(' : ',DaySpan(aktualis,masik));
WriteLn(' : ',DaySpan(aktualis,masik2));
ReadLn;
end.
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!