DaysBetween liefert nur 360 Tage, will aber 365Tage
-
Subtrahier doch einfach die beiden Datumswerte (TDateTime) voneinander, der ganzzahlige Anteil sind die Tage, der Rest die Stunden
[Edit] zu langsam...
-
DaysBetween() funktioniert bei mir völlig korrekt.
Aus der BCB 6 Hilfe:
Beschreibung
Mit DaysBetween können Sie die Differenz zwischen zwei TDateTime-Werten in Tagen ermitteln.
DaysBetween zählt nur ganze Tage. Die Differenz zwischen dem 31.12.1999, 23:59 Uhr und dem 01.01.2000, 23:58 Uhr wird von der Funktion DaysBetween also als Null berechnet, da die Differenz um eine Minute kürzer als ein ganzer Tag ist.
-
Hm...ich muss mich korrigieren, stimmt die Funktion DaysBetween liefert in 365Tage-Format das Ergebnis zurück, ich möchte aber in 360 Tage die Anzeige haben, gibt es dafür auch eine Funktion?
Gruss,
chullain
-
Hallo
Was soll das denn? Wieso sollte eine Funktion 360 Tage ausgeben, wenn es in Wirklichkeit 365 Tage sind? Außerdem kann ich mir gar nicht vorstellen wie eine Funktion zu einen solchen Wert kommen sollte.bis bald
akari
-
Der Grund ist einfach dafür, dass es das Projekt so verlangt, in Excel gibt es eine Funktion TAGE360(), diese rechnet eben die Differenz unter Berücksichtigung, dass ein Kalenderjahr aus 360 Tage besteht, diese würde ich gerne aber in C++ umsetzen, hab aber bis jetzt keine vernünftige Funktion dafür gefunden, höchstens eine die ein SYSTEMTIME als Parameter erwartet, aber kein TDateTime...
Diese meine ich:
int days360(SYSTEMTIME tm1, SYSTEMTIME tm2){ if( tm1.wDay > 30 ){ tm1.wDay = 30; } if( tm2.wDay > 30 ){ tm2.wDay = 30; } return ((tm1.wYear-tm2.wYear)*12+tm1.wMonth-tm2.wMonth)*30+tm1.wDay-tm2.wDay; }Ich weiss aber nicht, wie ich diese in TDateTime umbasteln kann, da die Klasse keine Parameter wie Tag, Monat, Jahr enthält. Oder gibt es Funktionen, die aus einem TDateTime-Objekt die einzelnen Parameter rausholen kann?
Gruss,
chullain
-
SYSTEMTIME enthält durchaus tag, Monat und Jahr. Auch für TDateTime gibt es solche Funktionen (DecodeDate). Dann gibt es noch DateTimeToSystemTime in der Sysutils. Schau dir doch einfach mal die ganzen Funktionen der DateUtils und der SysUtils an.
Übrigens, ein Jahr mit 360 Tagen nennt man ein Bankjahr.
-
Die Bank schämt sich aber nicht, Zinsen für 365 Tage zu berechnen

-
Ein Bankjahr scheint also aus 12 x 30 Tagen zu bestehen, macht auch irgendwo Sinn.
Nun zum Problem, wenn ich das richtig sehe will chullain nur eine Möglichkeit aus einem TDateTime Jahr, Monat und Tag rauszusuchen.
Gefunden hab ich dafür in der BCB-Hilfe das hier:
void __fastcall DecodeDate(unsigned short* year, unsigned short* month, unsigned short* day) const;Hab das mal eben schnell ausprobiert, hoffe das der Mist mit den Zeigern diesmal nen korrekten Eindruck macht.
unsigned short Jahr, Monat, Tag; TDateTime Datum1 = Date(); DecodeDate(Datum1, Jahr, Monat, Tag); Memo1->Clear(); Memo1->Lines->Add("Jahr: " + (AnsiString)Jahr); Memo1->Lines->Add("Monat: " + (AnsiString)Monat); Memo1->Lines->Add("Tag: " + (AnsiString)Tag);
-
Du kannst dein unsigned short nicht einfach in einen AnsiString casten. Für sowas kann man z.Bsp. IntToStr() nehmen.
-
Warum eigentlich nicht?
-
Hallo
Das geht in der Tat. Denn da es hier um konkrete Instanzen, nicht um Pointer geht, wird wie bei static_cast der Konstruktor von AnsiString aufgerufen, so das ein gültiger AnsiString aus dem Integer entsteht.
Allerdings halte ich das IntToStr für eleganter, verständlicher und sogar kürzer.bis bald
akari
-
Bei seinem C-Style-Cast könnte der Compiler allerdings einfach nur das Bitmuster der Int-Variable als AnsiString interpretieren. Dann käme ziemlicher Blödsinn raus. Das Verhalten eines solchen Casts ist meines Wissens nach nicht definiert, weswegen man so etwas vermeiden sollte.