Christian J. schrieb:
> Selbst wenn ich das Flash Problem mal außer Betracht lasse... weiss
> zufällig jemand, ob es fertige Routinen gibt, die mir 1458641787 wie
> gerade jetzt fertig umrechnen in eine time_t Struktur aus time.h?
Ja. Wird in der WordClock mit WS2812 benutzt, da findest Du es im
Source, nämlich timeserver.c:
1 | void
|
2 | timeserver_convert_time (struct tm * tmp, uint32_t seconds_since_1900)
|
3 | {
|
4 | time_t curtime;
|
5 |
|
6 | struct tm * mytm;
|
7 | uint_fast8_t summertime = 0;
|
8 |
|
9 | curtime = (time_t) (seconds_since_1900 - 2208988800U);
|
10 | curtime += 3600 * timezone; // localtime() on STM32 returns GMT, but we want ME(S)Z
|
11 |
|
12 | mytm = localtime (&curtime);
|
13 |
|
14 | // calculate summer time:
|
15 | if (mytm->tm_mon >= 3 && mytm->tm_mon <= 8) // april to september
|
16 | {
|
17 | summertime = 1;
|
18 | }
|
19 | else if (mytm->tm_mon == 2) // march
|
20 | {
|
21 | if (mytm->tm_mday - mytm->tm_wday >= 25) // after or equal last sunday in march
|
22 | {
|
23 | if (mytm->tm_wday == 0) // today last sunday?
|
24 | {
|
25 | if (mytm->tm_hour >= 2) // after 02:00 we have summer time
|
26 | {
|
27 | summertime = 1;
|
28 | }
|
29 | }
|
30 | else
|
31 | {
|
32 | summertime = 1;
|
33 | }
|
34 | }
|
35 | }
|
36 | else if (mytm->tm_mon == 9) // it's october
|
37 | {
|
38 | summertime = 1;
|
39 |
|
40 | if (mytm->tm_mday - mytm->tm_wday >= 25) // it's after or equal last sunday in october...
|
41 | {
|
42 | if (mytm->tm_wday == 0) // today last sunday?
|
43 | {
|
44 | if (mytm->tm_hour >= 3) // after 03:00 we have winter time
|
45 | {
|
46 | summertime = 0;
|
47 | }
|
48 | }
|
49 | else
|
50 | {
|
51 | summertime = 0;
|
52 | }
|
53 | }
|
54 | }
|
55 |
|
56 | if (summertime)
|
57 | {
|
58 | curtime += 3600; // add one hour more for MESZ
|
59 | mytm = localtime (&curtime);
|
60 | }
|
61 |
|
62 | tmp->tm_year = mytm->tm_year;
|
63 | tmp->tm_mon = mytm->tm_mon;
|
64 | tmp->tm_mday = mytm->tm_mday;
|
65 | tmp->tm_wday = dayofweek (mytm->tm_mday, mytm->tm_mday + 1, mytm->tm_year + 1900);
|
66 | tmp->tm_isdst = mytm->tm_isdst;
|
67 | tmp->tm_hour = mytm->tm_hour;
|
68 | tmp->tm_min = mytm->tm_min;
|
69 | tmp->tm_sec = mytm->tm_sec;
|
70 | }
|
Wenn Du die Sekunden seit 1.1.1970 und nicht 1.1.1900 hast, dann enfällt
diese Zeile:
1 | curtime = (time_t) (seconds_since_1900 - 2208988800U);
|
Als Schmankerl ist da noch die automatische
Sommer-/Wintzerzeit-Umstellung drin, die Dir localtime() auf einem STM32
ohne Betriebssystem nicht liefern kann.