Frage zu TDateTime



  • Hallo

    bin ganz neu im Forum und hab auch gleich mal ne Frage. (Falls dies der falsche Bereich ist bitte verschieben:))

    Also:

    ich bin gerade dabei mit Borland C++ Builder bischen zu Programmieren.
    Ich hab folgendes vor:

    Ich habe ein char array, indem ich z.b. "23022010" stehen habe.
    Die Zahlen sollen ein Datum darstellen. Jetzt möchte ich
    1. Das Datum in einer EditBox ausgeben -> 23.02.2010
    bekomme aber die Punkte nicht hin!
    2. Ich möchte die Differenz des Datums in dem Array zum Aktuellen Datum ausgeben. Wenn z.B. das Datum im Array das Mindesthalbarkeitsdatum ist, möchte ich sehen wie lange das Produkt noch haltbar ist!

    kann mir da jemand helfen? hab das TDateTime gefunden, kenn mich damit aber echt 0 aus!

    vielen dank im VOrraus 🕶



  • Hallo

    Statt dem char-Array solltest du String nehmen. Denn dann kannst du ganz einfach mit den String-Methoden Zeichen hinzufügen.

    Besser ist es aber gleich TDateTime zu verwenden, diese Klasse wird samt Beispielen in der Builder-Hilfe erklärt.

    Und wenn du voraus richtig schreibst, wirds auch nicht zensiert 😉

    bis bald
    akari



  • problem, das das array durch eine vorgefertigte funktion erstellt wird und die gibt char zurück!

    das mit dem tdatetime hab ich mir auch schon angeschaut, geht das nur mit den Anzahl der Tage seit dem 30.12.1899!?

    hier mal ein auszug aus der hilfe!
    /*

    Der ganzzahlige Teil eines TDateTime-Wertes von Delphi entspricht der Anzahl der Tage seit dem 30.12.1899. Der fraktionale Teil des TDateTime-Wertes gibt die Tageszeit an.

    Es folgen einige Beispiele für TDateTime-Werte und die entsprechenden Datums- und Zeitangaben:

    0 30.12.1899 12.00 Uhr
    2.75 1.1.1900 18.00 Uhr
    -1.25 29.12.1899 6.00 Uhr
    35065 1.1.1996 12:00 am

    Wenn beide TDateTime-Werte positiv sind, brauchen Sie zur Ermittlung der Tage zwischen zwei Datumsangaben die beiden Werte nur voneinander zu subtrahieren. Um eine Datums-/Zeitangabe um eine bestimmte Anzahl von Tagen zu erhöhen, addieren Sie einfach die Anzahl zu dem TDateTime-Wert hinzu. */

    vieleicht hat ja auch jemand ein beispiel:)
    *voraus* 😃



  • Hallo

    Eine TDateTime-Instanz ist intern die Anzahl der Tage seit dem 30.12.1899.
    Die Differenz aus zwei Instanzen kannst du nun einfach berechnen :

    TDateTime a = ...;
    TDateTime b = ...;
    int tage = a - b;
    

    bis bald
    akari



  • hmmmmm....

    wie schreib ich das dann???

    TDateTime a = Array[];
    TDateTime b = *wie kann ich das heutige datum einfügen?*;
    int tage = a - b;

    sorry für die wahrscheinlich einfachen fragen aber irgendwie bekomm ich das nicht hin! 😡



  • Schau dir doch mal die Methoden von TDateTime an, z.B. CurrentDate(). Es gibt auch verschiedene Konstruktoren mit denen man Jahr,Monat,Tag usw angegeben kann.



  • ok das mit dem aktuellen datum hab ich hinbekommen:

    TDateTime *dt = new TDateTime();
    *dt = dt->CurrentDate();
    Edit6->Text = dt->DateString();

    aber wie mach ich das mit dem daysbetween?

    so soll das hier ausehen:
    function DaysBetween(const ANow: TDateTime; const AThen: TDateTime): Integer;

    kann mir jemand ein beispiel geben??!
    Datum 1 ist in einem char Array gespeichert
    datum 2 ist das aktuelle datum

    viele dank!



  • Hallo

    Warum hast du dir nicht mal den Code angeschaut, den ich dir schon gepostet habe?

    TDateTime a = ...;
    TDateTime b = TDateTime::CurrentDate();
    int tage = a - b;
    

    bis bald
    akari



  • ich hab noch bischen das internet durchforstet und bin auf diese lösung gefunden:

    String ausgabe;

    TDateTime dd=Now();

    ausgabe=dd.DateTimeString(); //heutiges Datum

    dd=DaysBetween (dd,1);

    Edit3->Text = dd.DateTimeString();

    Jetzt zeigt es mir nicht an wieviel tage es sind sondern welches datum vor einem tag war!
    wie kann ich das ändern? wenn ich z.b. dd=DaysBetween (dd,22.02.2000); eingebe sagt er zu viele kommastellen...

    😡 😡 😡



  • akari schrieb:

    Hallo

    Warum hast du dir nicht mal den Code angeschaut, den ich dir schon gepostet habe?

    TDateTime a = ...;
    TDateTime b = TDateTime::CurrentDate();
    int tage = a - b;
    

    bis bald
    akari

    ahh ich glaub ich habs kapiert!!!!

    geht das nur mit diesem vergleichsdatum 30.12.1899????



  • Offensichlich noch nicht ganz kapiert. 😉

    Du kannst jedes Datum mit jedem vergleichen. Du musst nur noch einen Weg finden, aus dem char-Array ein TDateTime zu machen. Ich würde dazu das char-Array in einen AnsiString kopieren und daraus mittels AnsiString::SubString() die jeweils relevanten Teile rauskopieren und mittels AnsiString::ToIntDef() in int-Werte für Tag, Monat und Jahr wandeln. Darauf kannst du dann notfalls noch eine Plausibilitätsprüfung anwenden und daraus das TDateTime erzeugen.

    Gruß KK



  • hmmm sorry aber ich komm da nicht mit...:(

    hast du da nicht ein bsp?! bin kurz vorm verzweifeln und hab schon fast das ganze internet durchsucht 😞



  • Was genau ist denn das Problem? Die Verwendung von TDateTime oder das Ermitteln der Werte aus dem CString?



  • kann man in das tdatetime auch ein datum direkt "reinschreiben" (c.b. 22.03.2010) oder geht das nur mit der tagesdifferenz zu dem vergleichsdatum(1899...)

    verstehst du was ich meine?



  • Hallo

    Wie witte schon geschrieben hat, dafür gibt es Konstruktoren

    TDateTime x = TDateTime(2010, 03, 22);
    

    bis bald
    akari



  • jaaaaaaaaaaaaaa genau sowas hab ich gesucht!!! danke.... so einfach kann die lösung sein ich teste das ganze mal!!! 👍 👍 👍 🤡



  • ok funktioniert soweit!

    gibt es jetzt die möglichkeit, das datum aus einem char array zusammen zustellen?!

    ich dachte da an soetwas:

    array[0-3]=x;
    array[4-5]=y;
    array[6-7]=z;

    TDateTime x = TDateTime(x, y, z);

    sieht kommisch aus ich weiß...:)



  • Hallo

    Mit String::SubString (und eventuell String::Pos) kannst du das ungefähr so umsetzen, wie du es gezeigt hast.

    Einfacher aber dürfte der TDateTime-Konstruktor für AnsiString sein, der dann selber ide Konvertierung versucht :

    Wenn Sie die Methode mit einem AnsiString-Wert als src-Parameter und einem TDateTimeFlag-Objekt als flag-Parameter aufrufen, wird der Wert des resultierenden Objekts aus dem AnsiString-Wert konvertiert. Der Parameter flag gibt an, ob der String ein Datum, eine Uhrzeit oder beides enthält. Die Voreinstellung für flag ist DateTime.

    bis bald
    akari



  • hmmm tut mir leid aber das ist für mich etwas zu viel des guten:( bin leider kein informatiker und wie bereits erwähnt absoluter anfänger!

    wie soll das genau funktionieren?!

    String::SubString??? muss ich hier mein array angeben?!

    zu TDateTime-Konstruktor hab ich nix in der hilfe gefunden

    😕 😕 😕



  • Was ein Konstruktor ist, weißt du aber schon, oder?!? Wenn ja, schau einfach´bei TDateTime und String, welche es da gibt, wenn nicht, ist es viel zu früh, sich mit der VCL zu befassen...


Log in to reply