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