kann mir mal jemand helfen?
Suche nun schon seit geraumer Zeit nach dem Fehler:
Ziel: Umschaltung auf Sommerzeit mit NTP-Uhrzeit.
Folgender Code (in Auszügen):
"Code (in Auszügen)", ja?
In dem Fall bekommst Du hier meine Antwort(ebenfalls in Auszügen):
Irgendwas machst Du GRUNDLEGEND FALSCH, wenn Du so eine einfache Sache nicht hinbekommst, auf eine UTC-Zeitangabe entweder eine Stunde für Normalzweit oder zwei Stunden für Sommerzeit draufzuschlagen.
Glaub du hast mich nicht richtig verstanden.
Ich bin nicht zu dämlich auf die uhrzeit eine oder zwei Stunden drauf zu rechnen.
Es geht mir um die Erkennung: Haben wir jetzt Sommerzeit oder Winterzeit.
Dafür ist m.E. das tm_isdst da. ODER?
Allerdings bin ich der Meinung, dass tm_isdst nicht richtig von der Funktion localtime zurück kommt.
Ich hab das Beispiel jetz noch mal reduziert.
Und hier der GANZE Code.
Das stimmt auch, es muß nur ein Programm geben, dass dies dem Rechner mitteilt. Darum kümmert sich in der Regel ein Teil des Btriebssystems. Der Arduino hat aber keins.
Die Library ist wohl keine Spezial-Version für Berlin und Umgebung. Wie kommst du also darauf, dass in deinem struct tm *tmp = localtime(&now); irgendeine Zeitzonen-Information steckt?
Für nähere Informationen gibt es den Quellcode zu #include <time.h>
(was auch immer du da verwendest)
hk007:
Allerdings bin ich der Meinung, dass tm_isdst nicht richtig von der Funktion localtime zurück kommt.
Was ist für Dich "richtig" und was "falsch"?
Auf der Welt gibt e wohl an die 200 Länder in 24 Zeitzonen, mit etlichen dutzend verschiedener Sommerzeitregeln.
Dass mal so wie in der Europäischen Union mehr als ein Dutzend Länder zum selben Zeitpunkt auf Sommerzeit und zurück die Zeit umstellen, ist eher selten.
Gemeinsamkeiten bei der Sommerzeitumstellung sind:
Die Zeitumstellung erfolgt im Sommer:
Der Unterschied ist: Länder südlich des Äquators haben dann Sommer, wenn Länder nördlich des Äquators Winter haben - und umgekehrt.
Gemeinsamkeit ist wieder: Egal ob Nord- oder Südhalbkugel, bei Sommerzeit wird die Uhr immer vorgestellt.
Wenn Du nichts selbst mit Formeln berechnest, sondern Du die Angabe aus einer Blackbox-Library herausziehen möchtest, dann informiere Dich am besten, wie die Library funktioniert.
Und auch, von was für einem Landsmann die Library stammt.
Wenn es die Library eines US-Amerikanerst ist, hat er vielleicht die Sommerzeitregeln für die USA eingebaut. Aber wenn er aus der EU, aus Chile , Argentinien oder Australien stammt, dann ist die von ihm in die Library eingebaute Sommerzeitregel vielleicht die Sommerzeitregel für die Region auf der Welt, wo ER herstammt und nicht die Sommerzeitregel, wo DU die Library bei Dir auf dem PC installiert hast.
Tommy56:
Das stimmt auch, es muß nur ein Programm geben, dass dies dem Rechner mitteilt. Darum kümmert sich in der Regel ein Teil des Btriebssystems. Der Arduino hat aber keins.
Gruß Tommy
Ja, so gesehen ist das richtig.
Ich habe mich in meiner Faulheit wohl etwas von diesem Satz irritieren lassen:
The Daylight Saving Time flag (tm_isdst) is greater than zero if Daylight Saving Time is in effect, zero if Daylight Saving Time is not in effect, and less than zero if the information is not available.
Der hat mir suggeriert, dass ich hier die Info abgreifen kann. Dass auch das Feld beschrieben werden muss, daran hab ich gar nicht gedacht :o
Dann hack ich das mit dem letzten Sonntag im März/Oktober halt selber runter....
hk007:
Dann hack ich das mit dem letzten Sonntag im März/Oktober halt selber runter....
Falls Du etwas (fast) fertiges suchst:
Ich verwende zur Feststellung von Sommerzeit immer diese Funktion, die ich mir mal geschrieben und hier im Forum auch schon mehrfach gepostet habe, zum Beispiel hier: http://forum.arduino.cc/index.php?topic=172044.msg1278536#msg1278536
Nachteil dieser Funktion: Sie gilt so nur für das einundzwanzigste Jahrhundert von 2000 bis 2099 und benötigt für das kommende Jahrhundert von 2100 bis 2199 eine kleine Änderung (falls es dann die Sommerzeit immer noch gibt.
Das Vorgehen, wenn Du eine "Unixzeit" (Sekunden seit 1.1.1970 UTC) vorliegen hast, wäre wie folgt:
Du wandelst die Unixzeit in Tag, Monat, Jahr, Stunde, Minute,Sekunde (UTC-Zeit um).
Dann rufst Du meine Funktion mit dem Parameter tzHours=0 auf und bekommst einen boolschen Rückgabewert, ob es ein Zeitstempel ist, der in die Sommerzeit fällt.
Wenn ja, zählst Du auf den Zeitstempel zwei Stunden drauf, andernfalls eine Stunde, und bekommst die gesetzliche Zeit in Deutschland
Aufgepaßt: Beim Draufzählen von ein oder zwei Stunden auf UTC-Zeit kann ggf. das Datum auf den nächsten Tag umspringen!
Denn durch die unterschiedlichen Zeitzonen von London und Berlin, ist in London ggf. noch "heute um 23:00 Uhr, und in Berlin ist gleichzeitig Mitternacht 0:00 Uhr des Folgetags (Normalzeit), oder während der Sommerzeit sogar schon 01:00 Uhr nachts am Folgetag.