Sekunden portabel zu struct tm

24/10/2009 - 16:01 von Markus Wichmann | Report spam
Hi all,

ich habe folgendes Problem: Gegeben sei eine Variable buf vom Typ
uint32_t. In ihr steht eine Zeit, kodiert als Sekunden seit dem
1.1.1900, 00:00 Uhr, UTC. Nun ist die Frage, wie ich daraus halbwegs
systemunabhàngig ein struct tm oder ein time_t mache. Natürlich könnte
ich einfach die Sekunden zwischen dem 1.1.1970 und dem 1.1.1900 von der
Zahl einfach abziehen und das Ergebnis als time_t interpretieren lassen,
aber dabei gehe ich ja von der Annahme aus, dass die Epoche für den
time_t der 1.1.1970 und die Maßeinheit die Sekunde ist, und lasse völlig
die Möglichkeit außen vor, dass Millisekunden benutzt worden sein
könnten, was ja nicht ganz unwahrscheinlich ist.

OK, prinzipiell geht ja

struct tm t;
t.tm_sec = buf % 60;
t.tm_min = (buf / 60) % 60;
t.tm_hour = (buf / 3600) % 24);

àh... und dann?

t.tm_mday = (buf / (3600 * 24)) % 31;

oder wie? Aber schon dieser Code geht irgendwie am Ziel vorbei, denn er
làsst Schaltsekunden völlig außer Acht. Schalttage selbst sind nicht
unbedingt ein Problem, wenn ich irgendwann mal das Jahr ermittelt habe,
aber Schaltsekunden treten AFAIK völlig irregulàr auf.

Wie also geht das korrekt?

Tschö,
Markus
Nur weil ein Genie nix reißt, muß ja nun nicht gleich jeder Idiot
pausieren... Bully hats ja auch geschafft.
 

Lesen sie die antworten

#1 Alexander Bartolich
24/10/2009 - 19:42 | Warnen spam
Markus Wichmann schrieb:
ich habe folgendes Problem: Gegeben sei eine Variable buf vom Typ
uint32_t. In ihr steht eine Zeit, kodiert als Sekunden seit dem
1.1.1900, 00:00 Uhr, UTC. Nun ist die Frage, wie ich daraus halbwegs
systemunabhàngig ein struct tm oder ein time_t mache. Natürlich könnte
ich einfach die Sekunden zwischen dem 1.1.1970 und dem 1.1.1900 von der
Zahl einfach abziehen und das Ergebnis als time_t interpretieren lassen,
aber dabei gehe ich ja von der Annahme aus, dass die Epoche für den
time_t der 1.1.1970



struct tm *gmtime(const time_t *timep);

Du rufst gmtime mit einem auf 0 gesetzten time_t auf und erhàltst
den Start der Epoche.

und die Maßeinheit die Sekunde ist, und lasse völlig
die Möglichkeit außen vor, dass Millisekunden benutzt worden sein
könnten, was ja nicht ganz unwahrscheinlich ist.



time_t mktime(struct tm *tm);

Du füllst die Daten für 1970-01-02 00:00 in tm rein, rufst mktime
auf, und schaust ob 60*60*24 = 86400 rauskommt.

Ähnliche fragen