Datum als Timestamp



  • Ich brauche zu einem bestimmten Datum in Form eines Datums den TimeStamp long-Wert. Ich habe bereits SystemTime, Ctime usw. durchsucht, finde aber keine Methoden die long zurückliefern! Komme aber immer noch nicht mit der MSDN gut klar.

    Damit man weiss was ich meine, würde das in Java z.B. so aussehen:

    long ts = new TimeStamp(2007,1,1,0,0,0,0).getTime();
    

    Ich habe auch schon die Suche befragt, allerdings habe ich nichts gefunden, wo jemand diese Umwandlung brauchte.

    Vielen Dank.



  • Das nächste an einem long dürfte wohl time_t aus der <ctime> sein (der speichert die Sekunden sein 1.1.1970).



  • Die Frage ist, wie bekomm ich Infos zu ctime? Wenn ich ctime in der MSDN eingebe, kommen folgende Treffer.

    UPDATE: Zugriffsverletzung in RFX_Date wurde CTime Not initialisiert
    Eine Anwendung kann mit einer Zugriffsverletzung während die RFX_Date()-Funktion ausführen ... ACHTUNG: Der folgende Knowledge Base Artikel wurde durch ein maschinelles Übersetzungssystem ohne ...
    http://support.microsoft.com/kb/155721/de

    PRB: falscher CMonthCalCtl::GetCurSel(CTime)-Reklamationswert
    Wenn Sie das CMonthCalCtrl::GetCurSel(CTime) verwenden Sie, um das Datum zu erhalten das Datum ... ACHTUNG: Der folgende Knowledge Base Artikel wurde durch ein maschinelles Übersetzungssystem ohne ...
    http://support.microsoft.com/kb/235355/de

    INFO: aufeinanderfolgende Aufrufe von Ctime() überschreiben vorherige ...
    Nachfolgende Aufrufe der Ctime()-Funktion überschreiben die Ergebnisse eines vorherigen Aufrufs. ... ACHTUNG: Der folgende Knowledge Base Artikel wurde durch ein maschinelles Übersetzungssystem ohne ...
    http://support.microsoft.com/kb/33795/de

    Wenn NULL das CTime-Objekt ist, wenn die Zeitzone in Visual C++ auf ...
    Beschreibt die Zeichenfolge ein Problem, das auftritt, wenn wie 01/01/1970 oder wenn NULL das CTime ... Wenn NULL das CTime-Objekt ist, wenn die Zeitzone in Visual C++ auf Eastern (ICH und nur Kanada ...
    http://support.microsoft.com/kb/190471/de

    PRB: Routine CTime DDX für CRecordView Date Felder
    Erstellen Sie eine mit einer ODBC-Datenquelle zugehörige, die ein Datum- oder ein Zeitfeld enthält ... ACHTUNG: Der folgende Knowledge Base Artikel wurde durch ein maschinelles Übersetzungssystem ...
    http://support.microsoft.com/kb/110719/de

    Ist das ein Scherz? Das ist doch eine Klasse und es kommen Treffer wie "Zugriffsverletzung", Reklamationswert, CRecordView, usw? D.h. man gibt einen Klassennamen an und bekommt als ersten Treffer nicht mal den Aufbau einer Klasse oder sowas? 😮 Das wäre doch sicher verbesserungswürdig, oder seh ich das als einziger so?

    Weiter unten finde ich zwar dann CTime, aber das ist die Klasse der MFC. Aber mir ist es ja egal welche Klasse ich nehme, ich muss ja nur nen TimeStamp aus ein Datum bekommen. Nach Klick auf den Link von CTime kommt:

    In diesem Artikel wird beschrieben, wie Sie von den universellen Diensten der Klassenbibliothek für die Verwaltung von Datum und Uhrzeit profitieren können. Folgende Verfahren werden beschrieben:

    * Ermitteln der aktuellen Uhrzeit
    * Berechnen der verstrichenen Zeit
    * Formatieren einer Zeichenfolgenentsprechung eines Datums/einer Uhrzeit

    Mit der CTime-Klasse können Sie Datums- und Uhrzeitinformationen problemlos repräsentieren. Mit der CTimeSpan-Klasse wird verstrichene Zeit repräsentiert, z. B. die Differenz zwischen zwei CTime-Objekten.

    Hinweis Mit CTime-Objekten können Datumsangaben zwischen dem 1. Januar 1970 und dem 18. Januar 2038 repräsentiert werden. CTime-Objekte weisen eine Auflösung von 1 Sekunde auf. CTime basiert auf dem time_t-Datentyp, der in der Run-Time Library Reference definiert wird.

    Also kein Wort zu den Methoden hat oder ähnliches. Ich schreib das jetzt nur hier rein, weil das immer so mit der MSDN ist. Ich such mich dumm und dämlich. Wie macht man es denn richtig? Ich würde jetzt weiter rumklicken bis irgendwo steht Member Functions. Das find ich dann auch irgendwann.

    Aber ich denke ich hab wohl ein Problem. Ich kann mich nicht damit abfinden, dass man es dem Programmierer so schwer macht. Würde ich es einfach hinnehmen, dass es halt auch kompliziert geht (auch wenns einfach geht), würde ich wohl auch schneller voran kommen und nicht Zeit damit zu verbringen mich zu fragen, warum man es nur so kompliziert macht...



  • Also daß die MSDN so mager ist, glaube ich nicht. Ich finde dort auf Anhieb die Klassenreferenz der CTime (und mit etwas mehr Suche auch deren Methode GetTime()).

    Außerhalb der MFC solltest du dir mal die Man-Pages zu man: time() und Co. ansehen.



  • Hallo

    Tip : Die meisten Seiten der MSDN sind auf englisch, grad die Dokus zu C/C++ und WinAPI. Die meistens deutschen Seiten hingegen sind nur in den Foren und Fehlerbeschreibungen.
    Von einem deutschen Windows aber wird bei der Suche die deutsche Sprache vorgegeben. Du must also vorher die Suche in der Combobox rechts die Sprache auf englisch umstellen, dann findest du auch viel mehr.

    bis bald
    akari



  • So habs rausgefunden wie es ginge. Kann es aber mit CTime nicht realisieren, weil ich die afx.h includieren muss und das geht nicht, weil WTL schon CString mitliefert und mit der afx.h dann CString doppelt deklariert ist. Hach macht das Spaß! 😞

    @CStoll: Trotzdem vielen Dank für die Hilfe, macht bestimmt nicht soviel Spaß so nem Frusti weiterzuhelfen ;-).



  • akari schrieb:

    Hallo

    Tip : Die meisten Seiten der MSDN sind auf englisch, grad die Dokus zu C/C++ und WinAPI. Die meistens deutschen Seiten hingegen sind nur in den Foren und Fehlerbeschreibungen.
    Von einem deutschen Windows aber wird bei der Suche die deutsche Sprache vorgegeben. Du must also vorher die Suche in der Combobox rechts die Sprache auf englisch umstellen, dann findest du auch viel mehr.

    bis bald
    akari

    Danke für den Tipp. Bin schon immer auf MSDN.com gegangen, aber der erkennt ja automatisch und stellt auf deutsch um.



  • Ich habe mittlerweile wieder andere Klassen gefunden. Aber es wäre am besten an einen time_t Wert zu kommen. Wo bekomme ich Infos über <ctime>?

    Das einzige was ich in der MSDN finde ist:

    <ctime>

    namespace std {#include <time.h> };

    Include the standard header <ctime> to effectively include the standard header <time.h> within the std namespace.



  • Entweder du gehst weiter zu <time.h> (<ctime> ist die C++ Version des alten C-Headers) oder du schaust dich mal in den Man-Pages um nach man: mktime() und Familie.



  • Ich habe mir jetzt CTime, mktime, SYSTEMTIME, FILETIME, DateTime, CDateTime angeschaut und die Übersicht verabschiedet sich immer mehr! In einer Stunde bin ich noch blöder als vorher... Und was ich nicht verstehe, im Grunde ist das doch ein EINZEILER! 😞 (s.o.)



  • plizer schrieb:

    Und was ich nicht verstehe, im Grunde ist das doch ein EINZEILER! 😞 (s.o.)

    Nein, das sieht nur aus wie ein Einzeiler, weil die gesamte Logik in verschiedenen Methoden verteilt ist 😉

    OK, dann hier ein Lösungsansatz:

    • du nimmst dir einen 'struct tm' und füllst ihn mit den nötigen Werten
    • du jagst diesen 'struct tm' durch mktime() - das Resultat kannst du dann als TimeStamp verwenden

    (und wenn du willst, kannst du das ganze in eine Funktion packen, dann hast du in der Anwendung auch nur einen Einzeiler)



  • Vielleicht hilft Dir das hier



  • Dank euch beiden, das wird sicher helfen! Wenn ich es gleich rausbekomm werd ichs hier posten!

    Gibt es eigentlich eine Möglichkeit nur eine einzelne Klasse zu inkludieren oder geht das nur über die h-Datei? Sonst würde ich nur CTime inkludieren und mein Problem wäre ja auch gelöst.



  • Du kannst nur komplette Header inkludieren, keine Ausschnitte daraus. (du könntest dir höchstens die Definition der Klasse CTime aus ihrem Header rauskopieren, aber ob das dann noch compiliert werden kann, steht auf einem anderen Blatt)



  • Hab versucht CTime rauszufrickeln aus der afx.h, aber das wird nix, lauter linker-Fehler. Aber ich höre immer, dass es kein Problem sei ATL/WTL mit MFC zu mischen, warum aber klappt es nicht bei mir?!? (und die, die es behaupten haben nur gesagt, dass es geht, aber nicht wie)



  • Wenn du Linker-Fehler bekommst, liegt das vermutlich daran, daß du die richtige Lib unterschlagen hast (im Header stehen nur die Methodendeklarationen, die zugehörigen Definitionen sucht sich der Linker dann zusammen).

    (PS: Was die Zusammenarbeit von ATL und MFC angeht - damit kenne ich mich nicht aus)



  • Ich bekomme es einfach nicht hin. Wer mir ne Lösung bis 12 Uhr sagen kannst, die bei mir läuft bekommt direkt 10€ per paypal überwiesen. Immerhin noch besser als ein 10.000€ Projekt nicht bis Freitag fertig zu bekommen wegen so nem Scheiss :(.



  • Ich kann mich nur selber zitieren:

    CStoll schrieb:

    OK, dann hier ein Lösungsansatz:

    • du nimmst dir einen 'struct tm' und füllst ihn mit den nötigen Werten
    • du jagst diesen 'struct tm' durch mktime() - das Resultat kannst du dann als TimeStamp verwenden

    (und wenn du willst, kannst du das ganze in eine Funktion packen, dann hast du in der Anwendung auch nur einen Einzeiler)

    Oder als Grundgerüst:

    #include <ctime>
    
    std::time_t Timestamp(...)
    {
      std::tm t;
      //fülle t mit Werten
      return mktime(t);
    }
    


  • CStoll: Danke. Hab auch noch was über google gefunden und bisher das zusammengewerkelt:

    time_t CMainDlg::dateToTimestamp(int jahr, int monat, int tag, int stunde, int minute, int sekunde)
    {
    	time_t time_as_sec;
    	struct tm timestrct;
    
    	timestrct.tm_year = jahr - 1900; // Jahr - 1900
    	timestrct.tm_mon = monat - 1; // Monat - 1;
    	timestrct.tm_mday = tag;
    	timestrct.tm_hour = stunde;
    	timestrct.tm_min = minute;
    	timestrct.tm_sec = sekunde;
    
    	timestrct.tm_isdst = 0;
    
    	time_as_sec = mktime(&timestrct);
    	return time_as_sec;
    }
    

    Das läuft soweit, allerdings muss noch die Zeitzone einfließen. Das geht wohl mit timegm, weiss aber noch nicht genau wie.



  • plizer schrieb:

    Das läuft soweit, allerdings muss noch die Zeitzone einfließen.

    Was meinst du mit einfließen, der User gibt doch schon die Zeit ein. Inwiefern fließt da noch eine Zeitzone mit ein ?

    Weiß ja nicht genau was du meinst, aber als hilfe:

    localtime() - macht dir aus deiner time_t zeit die Lokale Zeit.
    gmtime() - macht dir aus deiner time_t zeit die GMT Zeit.

    Auf die GMT-Zeit kannst du ja wie du lustig bist aufaddieren bzw subtrahieren, je nach Zeitzone ...


Anmelden zum Antworten