DaysBetween liefert nur 360 Tage, will aber 365Tage



  • 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.


Anmelden zum Antworten