Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi problem bei "selbstgerschriebenem" decodedate... (https://www.delphipraxis.net/45708-problem-bei-selbstgerschriebenem-decodedate.html)

heiopei 13. Mai 2005 20:46

Re: problem bei "selbstgerschriebenem" decodedate.
 
abend,

Zitat:

@heiopei: Hast du denn verstanden, dass ich deine Frage nach der Fehlerursache beantwortet hatte?
ich versteh den sinn des satzes leider nich :shock: sorry

Zitat:

Nochmal im Klartext: Du hast den Aufruf von DateTimeToTimeStamp eliminiert, der in der Original-Unit die Basistransformation durchführt.
schon klar, dass ich den eliminiert habe, aber ich habe auch die ganze "datums"-verwaltung daran angepasst. also, jetz zeig ich noch mal meinen ganzen lösungsweg auf.

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:
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;
mfg,
heiopei

marabu 13. Mai 2005 21:20

Re: problem bei "selbstgerschriebenem" decodedate.
 
Delphi-Quellcode:
result := I * 365 + I div 4 - I div 100 + I div 400 + Day - 693594;
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.

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

heiopei 13. Mai 2005 21:27

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:

Habe ich mich jetzt verständlicher ausgedrückt?
kann den fehler jetzt natürlich sehr gut nachvollziehen, :thumb:

aber was soll das heißen? :gruebel:

Zitat:

...das ist zwar vom Ergebnis nicht ganz richtig, aber sei's drum
thx,
heiopei


:hello: :cheers: :hello:

marabu 13. Mai 2005 21:38

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

axelf98 14. Mai 2005 00:39

Re: problem bei "selbstgerschriebenem" decodedate.
 
Zitat:

Zitat von heiopei
hallo,
Zitat:

Der Datumstyp von Delphi ist TDateTime (=Double) nicht Integer
schon klar, aber ich sagte ja, dass ich die prozedur umgeändert habe.
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...

Dann schreib eine Prozedur wie
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 04:29 Uhr.
Seite 2 von 2     12   

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz