Forum: Mikrocontroller und Digitale Elektronik frage zu time.h


von fabian (Gast)


Lesenswert?

Guten Tag,
ich experimentiere gerade mit der time.h.
Habe versucht die 1481559030 was dem 12.12.2016 um 16uhr10 und 
30Sekunden entspricht mit der Funktion gmtime um zu Wandel.
dabei kommt mir bei   tm_wday  3 raus obwohl heute ja Montag ist und bei 
tm_year  146 obwohl mir das Jahr 2016 haben;-)


Was mache ich falsch?

Lg

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Keine Romane schreiben, sondern Source und Plattform zeigen.
1
$ cat gmtime.c
2
#include <stdio.h>
3
#include <time.h>
4
5
int main ()
6
{
7
    time_t now = 1481559030;
8
    struct tm  * tmp;
9
10
    tmp = gmtime (&now);
11
12
    printf ("year:   %4d\n", tmp->tm_year + 1900);
13
    printf ("month:  %02d\n", tmp->tm_mon + 1);
14
    printf ("day:    %02d\n", tmp->tm_mday);
15
    printf ("wday:   %02d\n", tmp->tm_wday);
16
    printf ("hour:   %02d\n", tmp->tm_hour);
17
    printf ("minute: %02d\n", tmp->tm_min);
18
    printf ("second: %02d\n", tmp->tm_sec);
19
20
    return 0;
21
}
22
$ cc gmtime.c -o gmtime && ./gmtime
23
year:   2016
24
month:  12
25
day:    12
26
wday:   01
27
hour:   16
28
minute: 10
29
second: 30

Also bei mir kommt glatt der 12.12.2016 raus. Wochentag 1 = Montag und 
Uhrzeit stimmt auch.

: Bearbeitet durch Moderator
von R. M. (n_a_n)


Lesenswert?

printf ("year:   %4d\n", tmp->tm_year + 1900);
                                         |
                                   er hat das vergessen

von Peter II (Gast)


Lesenswert?

R. M. schrieb:
> er hat das vergessen

weil ja 146 + 1900 = 2016 ist?

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

R. M. schrieb:
> printf ("year:   %4d\n", tmp->tm_year + 1900);
>                                          |
>                                    er hat das vergessen

Er schrieb was von tm_year = 146. Allerdings: 1900 + 146 = 2046 passt 
auch nicht. Das sind 30 Jahre zuviel. Der Wochentag wday = 3 ist ebenso 
falsch.

Er muss hier schon den Source zeigen. Die fehlenden 1900 sind nicht 
(allein) der Grund.

: Bearbeitet durch Moderator
von fabian (Gast)


Angehängte Dateien:

Lesenswert?

Ich habe ein Bild von meinem Code und dem Debuger angehängt da ist 
ersichtlich das ich eben nicht die richtigen Werte zurück bekomme!
Danke für deine Hilfe

von Peter II (Gast)


Lesenswert?

fabian schrieb:
> Ich habe ein Bild von meinem Code und dem Debuger angehängt da ist
> ersichtlich das ich eben nicht die richtigen Werte zurück bekomme!

aber niemand sieht welchen wert unixtime hat.

von Fielmann (Gast)


Lesenswert?

fabian schrieb:
> Ich habe ein Bild von meinem Code und dem Debuger angehängt da ist
> ersichtlich das ich eben nicht die richtigen Werte zurück bekomme!
> Danke für deine Hilfe

Stimmt. Kann man eindeutig sehen.

von fabian (Gast)


Angehängte Dateien:

Lesenswert?

Hier ein Bild wo dieses ersichtlich ist!
Sorry und danke!

von R. M. (n_a_n)


Lesenswert?

fabian schrieb:
> Ich habe ein Bild von meinem Code und dem Debuger angehängt da ist
> ersichtlich das ich eben nicht die richtigen Werte zurück bekomme!

Die Addition mit 1900 fehlt auf jeden Fall.
Zusätzlich ist der Wert von unixtime wichtig.

: Bearbeitet durch User
von fabian (Gast)


Lesenswert?

R. M. schrieb:
> Die Addition mit 1900 fehlt auf jeden Fall.

Ja aber 146 +1900 ist nicht 2016

Danke für die Hilfe

von R. M. (n_a_n)


Lesenswert?

Fielmann schrieb im Beitrag #4826139:
> Plenken und dann noch nach den I2C-Routinen fragen? Was soll das?

Was ist Plenken.

Ein von mir selber gemachter Fehler war, das ich die Jahreszahl 1900
nicht addiert habe. Darauf wollte ich aufmerksam machen.

Gut die Variable heißt nicht unixtime sondern timeunix.

Die Frage nach den I2C Routinen habe ich
gelöscht, weil ich gesehen habe das das Ergebnis im Debugfenster steht.
Ansonsten sind (mögliche) Übertragungsfehler immer verwirrend.

Was regt du dich eigentlich so auf ?

von (prx) A. K. (prx)


Lesenswert?

Doku lesen: "time_t represents seconds elapsed from Midnight, Jan 1 2000 
UTC (the Y2K 'epoch'). Its range allows this implementation to represent 
time up to Tue Feb 7 06:28:15 2136 UTC."
http://www.nongnu.org/avr-libc/user-manual/group__avr__time.html

Bisschen fies, das einfach so umzudefinieren.

von fabian (Gast)


Lesenswert?

Frank M. schrieb:
> printf ("year:   %4d\n", tmp->tm_year + 1900);
>     printf ("month:  %02d\n", tmp->tm_mon + 1);
>     printf ("day:    %02d\n", tmp->tm_mday);
>     printf ("wday:   %02d\n", tmp->tm_wday);
>     printf ("hour:   %02d\n", tmp->tm_hour);
>     printf ("minute: %02d\n", tmp->tm_min);
>     printf ("second: %02d\n", tmp->tm_sec);

In welche Variable schreibt printf? Wie kann ich auf die ausgabe von 
printf mit dem Debugger zugreifen?


A. K. schrieb im Beitrag #4826150:
> Woher kommt das gmtime?

Das das kommt aus der time.h

Lg

von Fielmann (Gast)


Lesenswert?

R. M. schrieb:
> Fielmann schrieb im Beitrag #4826139:
>> Plenken und dann noch nach den I2C-Routinen fragen? Was soll das?
>
> Was ist Plenken.
>
> Ein von mir selber gemachter Fehler war, das ich die Jahreszahl 1900
> nicht addiert habe. Darauf wollte ich aufmerksam machen.
>
> Gut die Variable heißt nicht unixtime sondern timeunix.
>
> Die Frage nach den I2C Routinen habe ich
> gelöscht, weil ich gesehen habe das das Ergebnis im Debugfenster steht.
> Ansonsten sind (mögliche) Übertragungsfehler immer verwirrend.
>
> Was regt du dich eigentlich so auf ?

Die I2C-Routinen haben nichts mit dem Problem zu tun.

von (prx) A. K. (prx)


Lesenswert?

"Though not specified in the standard, it is often expected that time_t 
is a signed integer representing an offset in seconds from Midnight Jan 
1 1970... i.e. 'Unix time'. This implementation uses an unsigned 32 bit 
integer offset from Midnight Jan 1 2000. The use of this 'epoch' helps 
to simplify the conversion functions, while the 32 bit value allows time 
to be properly represented until Tue Feb 7 06:28:15 2136 UTC. The macros 
UNIX_OFFSET and NTP_OFFSET are defined to assist in converting to and 
from Unix and NTP time stamps."

von fabian (Gast)


Lesenswert?

A. K. schrieb:
> Doku lesen: "time_t represents seconds elapsed from Midnight, Jan 1 2000
> UTC (the Y2K 'epoch'). Its range allows this implementation to represent
> time up to Tue Feb 7 06:28:15 2136 UTC."
> http://www.nongnu.org/avr-libc/user-manual/group__avr__time.html
>
> Bisschen fies, das einfach so umzudefinieren.

Was heißt das jetzt? 2000+146 ergibt auch nicht 2016?
hat jemand die richtige time.h? oder wie Löse ich das?

Danke Lg

von (prx) A. K. (prx)


Lesenswert?

fabian schrieb:
> Was heißt das jetzt?

Dass eine 32-Bit Unixtime aus Windows/Linux nicht einfach auf einen AVR 
transportiert und dort per gmtime zerlegt werden kann. Nicht ohne vorher 
UNIX_OFFSET abzuziehen.

von Peter II (Gast)


Lesenswert?

fabian schrieb:
> Was heißt das jetzt? 2000+146 ergibt auch nicht 2016?

das du von deinem 1481559030 vorher UNIX_OFFSET abziehen must.

von fabian (Gast)


Lesenswert?

Peter II schrieb:
> das du von deinem 1481559030 vorher UNIX_OFFSET abziehen must.

Ok jetzt passt es vielen vielen Dank!!!!!!!!!!

Eine Frage habe ich allerdings noch;-)

Ist bei mktime die tm_yday nötig? Gibt mein RTC nämlich nicht zurück!

Danke schon jetzt

Lg

von (prx) A. K. (prx)


Lesenswert?


von (prx) A. K. (prx)


Lesenswert?

Manuals/References sind echt nicht so dein Ding, oder?
"The original values of the tm_wday and tm_yday elements of the 
structure are ignored, and the original values of the other elements are 
not restricted to the ranges stated for struct tm."
http://www.nongnu.org/avr-libc/user-manual/group__avr__time.html#gae114b9ba0fce4e2d6297e0e66768bb75

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.