Zeitformat



  • Folgendes Szenario:
    Ich habe muss in einem Programm aus einer CSV-Datei unter anderem ein Datum mit Uhrzeit auslese. Sprich ich soll das einlesen 41077,9787268519 und dass soll dabei herauskommen: 17.06.2012 23:29:22. Weiss jemand wie das Datumsformat aufgebaut ist? Die erste Zahl ist auf jedenfalls der Tag. Doch abwann? Gibt es vielleicht eine einfache Möglichkeit es in die time Strukturen einzulesen?



  • Probier doch mal aus, wie sich nah beieinanderliegende Timestamps unterscheiden. Dann kommst du bestimmt schnell darauf, was die Zahlen bedeuten.



  • Hallo,

    41077/365 = 112, d.h. 2112 - 112 = 1900.

    Die Vorkommazahl gibt also die Anzahl der Tage seit dem 1.1.1900 an und der Nachkommaanteil ist die prozentuale Uhrzeit (z.B. 0,9787268519 * 24h = 23:29:22).

    Du programmierst mit C bzw. C++, oder?

    Da der time_t Datentyp seit dem 1.1.1970 zählt, mußt du also diese Anzahl Tage abziehen (vorausgesetzt das Datum ist größer als dieser Datumswert).

    double datetime = 41077.9787268519;
    
    const int DiffDays = 365 * 70 + leap_days; // hier müßte man die Anzahl der Schalttage (leap_days) noch richtig berechnen (m.E. 17)!!!
    const int SecondsPerDay = 24*60*60; // 86400
    std::time_t time = static_cast<std::time_t>((datetime - DiffDays) * SecondsPerDay + 0.5);
    

    Und mit den anderen Datumsfunktionen aus <ctime> kannst du dann weiter umrechnen...

    P.S. Der Originalwert könnte der Delphi-Datentyp TDateTime sein: Now: TDateTime, der ab dem 30.12.1899 zählt (also um 1 Tag gegenüber meinem oben angegeben Wert verschoben!).



  • OLE automation date

    An 8 byte double precision floating point value. The integral portion is the number of days since 30/12/1899[iii], the fractional part records the fraction of the day (i.e. 0.5 is 12 hours i.e. noon, 0.25 is 6 hours i.e. 6am etc.)

    [iii] Internal date used by Excel, supposedly simplified calculations but erroneously assumes 1900 to be a leap year

    Konvertierung müsste so gehen:

    posix_time::ptime comToPtime(double comTime)
    {
    	static const int64_t secPerDay = 86400;
    	static const int64_t offsetDays = 25569;	// Unterschied zwischen OLE- und UNIX-Epoche in Tagen
    	static const int64_t offsetSec = offsetDays * secPerDay;
    
    	int64_t unixTime = static_cast<int64_t>(comTime * static_cast<double>(secPerDay)) - offsetSec;    // hieran bist du interessiert
    
    	return posix_time::from_time_t(unixTime);
    }
    


  • Danke


Anmelden zum Antworten