Forum: Mikrocontroller und Digitale Elektronik Frage zu time_t usw.


von Thorsten S. (whitejack)


Lesenswert?

Hallo zusammen,

ich nutze etwas code und werde da nicht komplett schlau draus:

tm local;


void readClock()
{

  time_t now;

  time(&now);
  localtime_r(&now, &local);
  Serial.println(&local, "%A, %B %d %Y %H:%M:%S");

}

Der code läuft, wie kann ich auf beispielweise die Stunden zugreifen? 
Ganz klar ist mir der pintln auch nicht, ich hätte erwartet dass in 
"local" ein string enthalten ist, aber irgendwie wir er ja dann 
zerteilt. Ich hätte gern einfach nur die Zahlenwerte (integer) ...

Auch hier:

void setClockManually()
{

  #define RTC_UTC_TEST2 1709235881
  time_t rtc = RTC_UTC_TEST2;

  timeval tv = { rtc, 0 };
  settimeofday(&tv, nullptr);
}

Auch die Zeit setzen, lieber aus Einzelwerten. Habe mir mal die Sekunden 
seit 1970 für gerade eben ausgerechnet und eingesetzt... geht auch wie 
erwartet, aber ich würde lieber Tag, Monat, Jahr etc... übergeben und 
auch zurück bekommen...

von Jim M. (turboj)


Lesenswert?

Arbeite die Anfängerübungen in Deinem C Buch für struct durch, dann 
lernst Du wie auf die Elemente von struct tm zugegriffen werden kann.

von Thorsten S. (whitejack)


Lesenswert?

Das ist nicht das Problem, ich kenne diese Strukturen nicht.

time_t dürfte nur ein long sein... logischerweise



time(&now); scheint mir Überflüssig, da der Rückgabewert nicht 
ausgewertet wird und es ja auch nicht ändert da die Sekunden seit 1970 
ja in time_t stehen, verstehe ich den Sinn dieser Zeile Code nicht. 
Außer time holt den Wert nach now...

tm -> keine Ahnung, aber das hier hilft mir wohl weiter...

https://en.cppreference.com/w/c/chrono/tm


Aber das:

timeval tv = { rtc, 0 };
settimeofday(&tv, nullptr);

komme ich noch nicht ganz hinter wie das (timeval) aufgebaut ist

https://pubs.opengroup.org/onlinepubs/007908775/xsh/systime.h.html

Vor allem wie nun die Informationen vom einen zum anderen kommen... für 
mich etwas undurchsichtig nachzuvollziehen...

: Bearbeitet durch User
von Dergute W. (derguteweka)


Lesenswert?

Moin,

Naja, dieses Zeitgedoense ist halt so gewachsen (mit der Zeit). Welche 
structs jetzt wie aufgebaut sind, steht in den man-pages zu den 
Funktionen. Oder in jedem gut sortierten Internet.

Gruss
WK

von (prx) A. K. (prx)


Lesenswert?

Thorsten S. schrieb:
> ich kenne diese Strukturen nicht

Der Sinn von Doku besteht darin, diesem Zustand abzuhelfen.
https://www.tutorialspoint.com/c_standard_library/c_function_localtime.htm

von Bruno V. (bruno_v)


Lesenswert?

Thorsten S. schrieb:
> time_t dürfte nur ein long sein... logischerweise

Weißt Du, wie und wo Du das nachsehen kannst? Also ohne Internet. 
(Internet ist hier zwar auch gut und hilft beim Verständnis, doch der 
erste Schritt muss immer lokal in Deiner IDE möglich sein)

(Gilt auch für die anderen Strukturen und Funktionen)

: Bearbeitet durch User
von Keks F. (keksliebhaber)


Lesenswert?

Thorsten S. schrieb:
> Außer time holt den Wert nach now...

Korrekt.

Thorsten S. schrieb:
> tm -> keine Ahnung, aber das hier hilft mir wohl weiter...

Auch korrekt.

Wo ist jetzt das Problem?
Die Dokumentation ist doch sehr eindeutig, gerade in Bezug auf diese 
Frage:

Thorsten S. schrieb:
> Der code läuft, wie kann ich auf beispielweise die Stunden zugreifen?

Thorsten S. schrieb:
> Ganz klar ist mir der pintln auch nicht, ich hätte erwartet dass in
> "local" ein string enthalten ist, aber irgendwie wir er ja dann
> zerteilt.

Nö, println weiß nur mit tm umzugehen und macht das dann entsprechend 
des Formatstrings.

Ich sehe hier eher ein Grundlagenproblem.

von Thorsten S. (whitejack)


Lesenswert?

Danke für eure Hilfe.

Dergute W. schrieb:
> Naja, dieses Zeitgedoense ist halt so gewachsen (mit der Zeit)

Jo, muss ich erstmal durchsteigen, bin sonst eher sehr hardwarenah 
unterwegs...in Assembler und C.

Keks F. schrieb:
> Wo ist jetzt das Problem?

Es wundert mich zum Beipsiel noch, warum local nicht vom Typ timeval 
ist...

Und warum dort nicht mit gettimeofday() gearbeitet wird...

In meiner Vorstellung läuft dort irgendwo in den Untiefen ein 
Sekundenzähler, getrieben von irgendeiner internen Hardware in 
irgendeinem Interrupt...

Keks F. schrieb:
> Ich sehe hier eher ein Grundlagenproblem.

Absolut nicht ausgeschlossen. :-)

: Bearbeitet durch User
von Keks F. (keksliebhaber)


Lesenswert?

Thorsten S. schrieb:
> Es wundert mich zum Beipsiel noch, warum local nicht vom Typ timeval
> ist...

Du definierst es doch als tm und so will es auch die Funktion.

Timeval ist ein komplett anderer Typ.

Unterschied ist entsprechend der Doku hauptsächlich, dass der 
Zeitstempel und die Mikrosekunden noch angegeben werden.

von Thorsten S. (whitejack)


Lesenswert?

Jo.

Ich brauche eigentlich nur etwas das nach 24 Stunden true wird, bis es 
1x abgefragt wurde und das so genau wie es geht...

von Εrnst B. (ernst)


Lesenswert?

Thorsten S. schrieb:
> Ich brauche eigentlich nur etwas das nach 24 Stunden true wird,

24 Stunden "nach was"?
Evtl. kannst du dir das ganze struct tm sparen, und einfach ausnutzen, 
dass 24 Stunden 24×60 Minuten und damit 24×60×60 Sekunden sind. time_t 
enthält Sekunden. Kann man einfach vergleichen, "(now > ziel_zeit_24h)" 
wird dann true...

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Thorsten S. schrieb:
> Ich brauche eigentlich nur etwas das nach 24 Stunden true wird
Auf welcher Zielplattform? Wenn du z.B. eine RTC drauf hast, dann kannst 
du dir einfach einen Interrupt auslösen lassen.

von Peter (pittyj)


Lesenswert?

Ich gehe in meine Shell, und gebe ein:
man settimeofday
und schon bekomme ich

GETTIMEOFDAY(2)            Linux Programmer's Manual 
GETTIMEOFDAY(2)

NAME
       gettimeofday, settimeofday - get / set time

SYNOPSIS
       #include <sys/time.h>

       int gettimeofday(struct timeval *tv, struct timezone *tz);
       int settimeofday(const struct timeval *tv, const struct timezone 
*tz);

   Feature Test Macro Requirements for glibc (see 
feature_test_macros(7)):

       settimeofday(): _BSD_SOURCE
usw...

Und das geht auch für localtime und time. Auch Verweise auf andere 
Funktionen sind dort zu finden.
Und das funktioniert schon seit >30 Jahren.

von J. S. (jojos)


Lesenswert?

Das nutzt nichts wenn man meint die Grundlagen zu Strukturen und Zeigern 
überspringen zu können.

von Thorsten S. (whitejack)


Lesenswert?

Lothar M. schrieb:
> Auf welcher Zielplattform?

ESP32 über Arduino. Keine RTC, keinen Internetzugang.

Εrnst B. schrieb:
> und einfach ausnutzen,
> dass

Jup, sehe ich ähnlich. Ich brauche einen "Trigger" immer (jeden Tag) um 
0:00 Uhr.

Peter schrieb:
> Und das funktioniert schon seit >30 Jahren.

Jo, ich habe die noch nie genutzt und fand das gefundene Beispiel 
einfach sehr "gewöhnungsbedürftig", Thema UNIX Sekunden ab 1970 ist mir 
bekannt und ja auch kein Hexenwerk...

von Thomas W. (dbstw)


Lesenswert?

Thorsten S. schrieb:
>
> Peter schrieb:
>> Und das funktioniert schon seit >30 Jahren.
>
> Jo, ich habe die noch nie genutzt und fand das gefundene Beispiel
> einfach sehr "gewöhnungsbedürftig", Thema UNIX Sekunden ab 1970 ist mir
> bekannt und ja auch kein Hexenwerk...

Aber Ihr wisst schon, dass ab 19-Jan-2038 03:14:07 Uhr UTC Dunkeltuten 
ist und der Rechner zurueck zum 01-JAN-1970 gesetzt wird?

Richtige Betriebssysteme (TM) wie OpenVMS haben vierstellige 
Jahreszahlen, der naechste Overflow ist am 31-DEC-9999. Das ist mal 
vorausschauend programmiert.

von Εrnst B. (ernst)


Lesenswert?

Thomas W. schrieb:
> Aber Ihr wisst schon, dass ab 19-Jan-2038 03:14:07 Uhr UTC Dunkeltuten
> ist und der Rechner zurueck zum 01-JAN-1970 gesetzt wird?

Du hast mitbekommen, dass time_t inzwischen 64 Bit hat, und damit noch 
ein paar Hundert Milliarden Jahre safe ist?

von Thomas W. (dbstw)


Lesenswert?

Εrnst B. schrieb:
> Thomas W. schrieb:
>> Aber Ihr wisst schon, dass ab 19-Jan-2038 03:14:07 Uhr UTC Dunkeltuten
>> ist und der Rechner zurueck zum 01-JAN-1970 gesetzt wird?
>
> Du hast mitbekommen, dass time_t inzwischen 64 Bit hat, und damit noch
> ein paar Hundert Milliarden Jahre safe ist?

Da hast Du ja recht, so recht.

von Εrnst B. (ernst)


Lesenswert?

Übrigens geht der (32-Bit) time_t Überlauf nicht auf 0, sondern auf 
−2.147.483.648.
Ist ein signed Wert.
d.H. es wird nicht nach 1970 gesprungen, sondern nach 1901.

von Axel R. (axlr)


Lesenswert?

Ich hab mir VS-Code und die entsprechenden Erweiterngen installiert 
(Platformio usw). Da drück ich F12, sehe nach und mit Alt-links wieder 
zurück. Find ich praktisch und bin begeistert. Geht das bei Dir nicht? 
Nahezu jede IDE bietet diese Funktionalität, die die Definitionen 
"hineinzusehen", dennke ich. Nur eben andere Tasten. Bei VSCode ists 
F12.

von Harald K. (kirnbichler)


Lesenswert?

Axel R. schrieb:
> Nahezu jede IDE bietet diese Funktionalität, die die Definitionen
> "hineinzusehen", dennke ich.

Tja, denkst Du. Die von manchen so innig geliebte Arduino-IDE in der 
Version 1.x kann das nicht, das haben sie erst der Version 2.x 
beigebracht, die aber wird von vielen abgelehnt, weil zu ... irgendwas.

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.