![]() |
problem bei "selbstgerschriebenem" decodedate...
Liste der Anhänge anzeigen (Anzahl: 1)
hallo,
da ich in letzter zeit nicht wirklich viel zu tun hatte, hab ich einfach mal zur "optimierung" eine eigene datumsfunktionen-unit geschrieben, wobei ich den größten teil aus der sysutils übernommen habe und neuzusammengesetzt habe :oops: naja, so weit so gut - jetzt hab ich nur das problem, das meine decodedate funktion völlig falsche werte zurückgibt! ich hab schin alles mögl. auspobiert und mit der sysutils verglichen, aber es geht einfach nicht . deswegen möchte ich euch mal fragen, ob ihr den fehler findet - siehe anhang!!! (ich bräuchte das ganze dann doch sehr bald, da ich es in ein neues projekt einbinden möchte!) mfg, heiopei |
Re: problem bei "selbstgerschriebenem" decodedate.
warum schaut der titel bei mir so komisch aus (im portal)!!!
heiopei |
Re: problem bei "selbstgerschriebenem" decodedate.
Zitat:
mfG mirage228 |
Re: problem bei "selbstgerschriebenem" decodedate.
abend
PUSHi (da ja nur einer die unit runtergeladen hat ;-)) würd mich echt rießig freuen, wenn jemand den fehler finden könnte, da ich die unit jetzt doch früher als gedacht BENÖTIGE. nochmal zum problem: die funktion decodedate liefert einfach total falsche werte zurück.rufe ich z.b. decodedate(get_sysdate, ...) auf, so bekomme ich für 10.5.2005 ungefähr so was raus - 12.5.106. die funktion get_sysdate hab ich schon überprüft, die liefert richtige ergebnisse - also kanns nur an decodedate liegen!!! :-( mfg, heiopei |
Re: problem bei "selbstgerschriebenem" decodedate.
morgejn
ich wags einfach nochmal PUSH (still 1 download :-() wäre echt wichtig, das ich den fehler finde, da ich die unit bis freitag in ein programm fertig eingebunden haben muss. ihr wisst ja - seine eigenen fehler sieht man nie ;-) also wär echt super. wenn ihr den fehler finden würdet. weil ich sonst einen großen teil meines programm neu machen muss !!!! mfg, heiopei |
Re: problem bei "selbstgerschriebenem" decodedate.
mitdach,
so jetzt versuch ich einfach nochmal: also ich hab aus der unit sysutils die folgende funktion rauskopiert und etwas verändert; dabei ermittelt sie aus dem datum "date" vom typ integer den tag, monat und das jahr:
Delphi-Quellcode:
um das datum dann als string anzuzeigen verwende ich momentan folgende funktion:
//ein paar definitionen...
type PDayTable = ^TDayTable; TDayTable = array[1..12] of Word; const MonthDays: array [Boolean] of TDayTable = ((31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31), (31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31)); //diese funktion überprüft, ob das jahr "year" ein schaltjahr ist function IsLeapYear(Year: Word): Boolean; begin Result := (Year mod 4 = 0) and ((Year mod 100 <> 0) or (Year mod 400 = 0)); end; //diese prozedur berechnet aus dem datum "date" das jahr, den monat und den tag procedure DecodeDate(date: Integer; var Year, Month, Day: Word); const D1 = 365; D4 = D1 * 4 + 1; D100 = D4 * 25 - 1; D400 = D100 * 4 + 1; var Y, M, D, I: Word; DayTable: PDayTable; begin try if date <= 0 then begin Year := 0; Month := 0; Day := 0; end else begin Dec(date); Y := 1; while date >= D400 do begin Dec(date, D400); Inc(Y, 400); end; DivMod(date, D100, I, D); if I = 4 then begin Dec(I); Inc(D, D100); end; Inc(Y, I * 100); DivMod(D, D4, I, D); Inc(Y, I * 4); DivMod(D, D1, I, D); if I = 4 then begin Dec(I); Inc(D, D1); end; Inc(Y, I); DayTable := @MonthDays[IsLeapYear(Y)]; M := 1; while True do begin I := DayTable^[M]; if D < I then Break; Dec(D, I); Inc(M); end; Year := Y; Month := M; Day := D + 1; end; except raise conv.Create('Fehler beim decodieren eines Datumswertes!' + #10 + 'Wenden Sie sich bitte an den Hersteller...'); end; showmessage(inttostr(date)); end;
Delphi-Quellcode:
soweit so gut, nur gibt die funktion föllig falsche werte aus! hab schon alles verglichen und ausprobiert, aber jetzt weiss ich nicht mehr weiter.
function DateToStr(date: Integer): string;
var a, b, c: Word; begin DecodeDate(date, a, b, c); result := IntToStr(c) + '.' + IntToStr(b) + '.' + IntToStr(a); // result := IntToStr(ExtractDay(date)) + '.' + IntToStr(ExtractMonth(date)) + // '.' + IntToStr(ExtractYear(date)); end; warum bekomme ich mit decodedate also so falsche werte?!? mfg, heiopei |
Re: problem bei "selbstgerschriebenem" decodedate.
Zitat:
Grüße vom marabu |
Re: problem bei "selbstgerschriebenem" decodedate.
Zitat:
Niemals an VCL Units rumpfuschen oder Ersatz-Units herstellen nur um ein paar Bytes zu optimieren !!! Der Datumstyp von Delphi ist TDateTime (=Double) nicht Integer
Delphi-Quellcode:
//diese prozedur berechnet aus dem datum "date" das jahr, den monat und den tag
procedure DecodeDate(date: Integer; var Year, Month, Day: Word); // ******* |
Re: problem bei "selbstgerschriebenem" decodedate.
hallo,
Zitat:
ich möchte eben nur mit dem datum und nicht mit der zeit arbeiten, weshalb ich einfach nur einen integer typ für das datum benötige... in sysutils wird das datum "date" vo typ TDateTime auch erst mit ttimestamp in ein integer wert umgewandelt, womit ich diese prozedur der umwandlung ja auslassen kann und gleich die eigentliche prozedur ablaufen lassen kann. wer genau wissen will, sollte sich meine unit anschauen, da man dann mein vorgehen besser / detailierter nachvollziehen kann!!! Zitat:
mfg, heiopei |
Re: problem bei "selbstgerschriebenem" decodedate.
@heiopei: Hast du denn verstanden, dass ich deine Frage nach der Fehlerursache beantwortet hatte?
Nochmal im Klartext: Du hast den Aufruf von DateTimeToTimeStamp eliminiert, der in der Original-Unit die Basistransformation durchführt. marabu |
Re: problem bei "selbstgerschriebenem" decodedate.
abend,
Zitat:
Zitat:
ich erhalte ein datum mittels get_sysdate. hier wird eine api-funktion aufgerufen, die das datum (+zeit) in form von tsystemtime ausgibt. dann wandle ich dieses ergebnis mit encodedate in eine gültige integer-zahl um. die sollte jetz imho timestamp.date (oder wie das heißt) entsprechen. so, jetzt löse ich diese zahl mit hilfe (der gegenfunktion) von encodedate wieder in die einzelnen zahlen-werte auf. dabei sollte es doch eigentlich völlig egal sein, dass ich timestampto... weglasse, da ich ja eh nur mit dem datum arbeite und nicht auch noch mit der zeit. --> da ich von vornherein nur mit integerwerten arbeite, brauche ich auch keine umformung mit timestampto... vornehmen!!!! oder liege ich hier jetzt falsch -wenn ja tuts mir fett sorry ;-) noch ein paar ergenzungen:
Delphi-Quellcode:
mfg,
type TSystemTime = record
wYear: Word; wMonth: Word; wDayOfWeek: Word; wDay: Word; wHour: Word; wMinute: Word; wSecond: Word; wMilliseconds: Word; end; //diese funktion berechnet aus dem übergebenen jahr, monat und dem tag das datum function EncodeDate(Year, Month, Day: Word): Integer; var I: Integer; DayTable: PDayTable; begin try result := 0; DayTable := @MonthDays[IsLeapYear(Year)]; if (Year >= 1) and (Year <= 9999) and (Month >= 1) and (Month <= 12) and (Day >= 1) and (Day <= DayTable^[Month]) then begin for I := 1 to Month - 1 do Inc(Day, DayTable^[I]); I := Year - 1; result := I * 365 + I div 4 - I div 100 + I div 400 + Day - 693594; end; except raise conv.Create('Fehler beim codieren von Datumswerten in einen ' + 'Integer-Wert!'); end; end; //funktion ermittelt das aktuelle systemdatum function Get_SysDate: Integer; var SystemTime: TSystemTime; begin GetSystemTime(SystemTime); with SystemTime do Result := EncodeDate(wYear, wMonth, wDay); end; heiopei |
Re: problem bei "selbstgerschriebenem" decodedate.
Delphi-Quellcode:
Du berechnest in deiner Routine EncodeDate() zuerst die Gesamttage seit Beginn der Zeitrechnung - das ist zwar vom Ergebnis nicht ganz richtig, aber sei's drum. Zuletzt rechnest du durch Subtraktion von 693594 Tagen das Ergebnis in die Zahl der Tage seit dem 31.12.1899 um.
result := I * 365 + I div 4 - I div 100 + I div 400 + Day - 693594;
Warum? In deiner Routine DecodeDate() gehst du doch davon aus, das das übergebene Datum die Zahl der Tage seit dem 1.1.0001 ist! Habe ich mich jetzt verständlicher ausgedrückt? marabu |
Re: problem bei "selbstgerschriebenem" decodedate.
abend,
ach du sch... hab, mich schon gefragt, ob ich den wert wirklich mit kopieren muss. :wall: vielen vielen dank!!! Zitat:
aber was soll das heißen? :gruebel: Zitat:
heiopei :hello: :cheers: :hello: |
Re: problem bei "selbstgerschriebenem" decodedate.
Die Tage zwischen dem 4. und dem 15. Oktober 1582 hat es nie gegeben, sie fielen der Kalenderreform von Papst Gregor XIII zum Opfer. Insofern hast du eine kleine Unschärfe in deinen Routinen.
marabu |
Re: problem bei "selbstgerschriebenem" decodedate.
Zitat:
Delphi-Quellcode:
procedure MyPersonalDecodeDate(date: Integer; var Year, Month, Day: Word);
begin DecodeDate(date, Year, Month, Day); // einfach die Funktion mit einem Integer füttern... end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:52 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz