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.
-- gUnter nanonüm in de.alt.anime
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.
--