Frage zu time_t usw.

OP #7613757
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...

OP #7613779
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...

#7613793
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.

OP #7613801
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. :-)

#7613868
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>

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

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

1
   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.

OP #7614116
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...

Gast #7614170
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.

#7614221
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren