Opened 12 years ago
Closed 12 years ago
#203 closed Fehler (fixed)
Sommer - / Winterzeit - Umschaltung
| Reported by: | Melanie Hermann | Owned by: | Melanie Hermann |
|---|---|---|---|
| Priority: | kurzfristig | Milestone: | |
| Component: | Gesamtsystem | Version: | ALLE |
| Severity: | Fehler | Keywords: | |
| Cc: |
Description
Beim Testen wurde festgestellt, dass die Sommer-/Winterzeit-Umschaltung nicht immer funktioniert.
Attachments (1)
Change History (5)
comment:1 by , 12 years ago
comment:2 by , 12 years ago
Jetzt:
if (nowtp.tm_isdst != futuretp.tm_isdst)
{ // Wenn Sommer- /Winterzeit in der nächsten Sekunde wechselt
if (1 == futuretp.tm_isdst)
DTLOG(logidTS, DT_WINTERDST_TO_SUMMERDST);
else
DTLOG(logidTS, DT_SUMMERDST_TO_WINTERDST);
daylightChange = 0; // 'Flag' startet die Prüfung der Systemzeitänderungen für die aktuelle und die nächsten 6 Sekunden (xx:59:59 - xx:00:05)
lastSystemTime = aValue(CurrentSystemTime); // Merken dieser ausgelesenen Systemzeit für den Zeitpunkt der Umschaltung
if (theApp.m_DSfGApi) //DSfG will Hinweis bei Sommer-/Winter-Umschaltung
theApp.m_DSfGApi->Event_ArchivFillHinweis((aValue(CurrentSystemTime)+pValue(DiffToUTC)),MAX_MESSGAS_STREAM ,true,GetDSfGErrorNr(HIN_NUR_DSFG_UHRZEIT_ALT));
}
if (++daylightChange <= 7)
{ // Nach Umschaltungserkennung, wird von xx:59:59 bis xx:00:05 überwacht, ob die Systemzeit verstellt wurde und dieses geloggt
time_t diff = aValue(CurrentSystemTime) - lastSystemTime;
DTLOG(logidTS, DT_TIME_INFO_1, daylightChange, FormatTimeGmt(aValue(CurrentSystemTime)), FormatTimeGmt(lastSystemTime), (long)diff);
if (8 < fabs((long)diff)) // Dieses 'if-else' ist unnötig. Bleibt aber für Diagnose-Log drin.
{ // Wenn die Systemzeit von Windows verstellt wurde
DTLOG(logidTS, DT_SYSTIME_ADJUSTMENT, daylightChange);
}
else
{ // Wenn sich die Systemzeit von Windows nicht verstellt wurde
DTLOG(logidTS, DT_NO_SYSTIME_ADJUSTMENT, daylightChange);
}
if (daylightChange == 2)
{ // Im erster Durchlauf ist Sekunde in der DaylightChange erkannt wurde, deshalb erst im zweiten Durchlauf
aValue(CurrentSystemTime) = getUtcTime(); // Erneutes Auslesen der aktuellen Systemzeit
myLocaltime(&nowtp, &aValue(CurrentSystemTime));
pValue(DiffToUTC) = getGmtOff(nowtp.tm_isdst ? true : false); // Erfassen, ob aktuell Sommer- oder Winterzeit ist
SavePVars();
aValue(CurrentLocalTime) = aValue(CurrentSystemTime) + pValue(DiffToUTC);
if (theApp.m_DSfGApi)
{
time_t locDSfGTime = aValue(CurrentLocalTime) - (aValue(CurrentLocalTime) % 60);
theApp.m_DSfGApi->Event_ArchivFillHinweis(locDSfGTime, MAX_MESSGAS_STREAM , true, GetDSfGErrorNr(HIN_NUR_DSFG_UHRZEIT_NEU));
}
changeSystemTime(1); // Wie ERZ2000NG
}
}
else
{ // Jetzt (keine viertel Stunde) kein Sommer-/Winterzeitwechsel oder Winter-/Sommerzeitwechsel möglich
}
comment:3 by , 12 years ago
Änderungen:
- if (++daylightChange <= 7)-else-Zweig: changeSystemTime(0); entfernt
- if (8 < fabs((long)diff)): diff -= 2; changeSystemTime((long)-diff); entfernt
- if (8 < fabs((long)diff))-else-Zweig: changeSystemTime(0); entfernt
- if (daylightChange == 8) daylightChange = 10; entfernt
- if (daylightChange == 2): changeSystemTime(1); eingefügt
comment:4 by , 12 years ago
| Resolution: | → fixed |
|---|---|
| Status: | new → closed |
by , 12 years ago
| Attachment: | 20131108_Diagnose.docx added |
|---|
Note:
See TracTickets
for help on using tickets.
Lösung: Änderungen in der Funktion SecTimerFunc().
Vorher:
if (nowtp.tm_isdst != futuretp.tm_isdst) { // Wenn Sommer- /Winterzeit in der nächsten Sekunde wechselt if (1 == futuretp.tm_isdst) DTLOG(logidTS, DT_WINTERDST_TO_SUMMERDST); else DTLOG(logidTS, DT_SUMMERDST_TO_WINTERDST); daylightChange = 0; // 'Flag' startet die Prüfung der Systemzeitänderungen für die aktuelle und die nächsten 6 Sekunden (xx:59:59 - xx:00:05) lastSystemTime = aValue(CurrentSystemTime); // Merken dieser ausgelesenen Systemzeit für den Zeitpunkt der Umschaltung if (theApp.m_DSfGApi) //DSfG will Hinweis bei Sommer-/Winter-Umschaltung theApp.m_DSfGApi->Event_ArchivFillHinweis((aValue(CurrentSystemTime)+pValue(DiffToUTC)),MAX_MESSGAS_STREAM ,true,GetDSfGErrorNr(HIN_NUR_DSFG_UHRZEIT_ALT)); } if (++daylightChange <= 7) { // Nach Umschaltungserkennung, wird von xx:59:59 bis xx:00:05 getestet, ob die Systemzeit verstellt wurde. Wenn ja, wird diese Verstellung rückgängig gemacht. time_t diff = aValue(CurrentSystemTime) - lastSystemTime; DTLOG(logidTS, DT_TIME_INFO_1, daylightChange, FormatTimeGmt(aValue(CurrentSystemTime)), FormatTimeGmt(lastSystemTime), (long)diff); if (8 < fabs((long)diff)) { // Wenn die Systemzeit verstellt wurde, ... DTLOG(logidTS, DT_SYSTIME_ADJUSTMENT, daylightChange); diff -= 2; changeSystemTime((long)-diff); // ... wird der Änderung entgegengewirkt } else { // Wenn sich die Systemzeit um maximal eine Sekunde geändert hat, wird die Systemzeit nicht angepasst DTLOG(logidTS, DT_NO_SYSTIME_ADJUSTMENT, daylightChange); changeSystemTime(0); } if (daylightChange == 8) daylightChange = 10; // 'Flag' beendet die Prüfung der Systemzeitänderungen if (daylightChange == 2) { // Im erster Durchlauf ist Sekunde in der DaylightChange erkannt wurde, deshalb erst im zweiten Durchlauf aValue(CurrentSystemTime) = getUtcTime(); // Erneutes Auslesen der aktuellen Systemzeit myLocaltime(&nowtp, &aValue(CurrentSystemTime)); pValue(DiffToUTC) = getGmtOff(nowtp.tm_isdst ? true : false); // Erfassen, ob aktuell Sommer- oder Winterzeit ist SavePVars(); aValue(CurrentLocalTime) = aValue(CurrentSystemTime) + pValue(DiffToUTC); if (theApp.m_DSfGApi) { time_t locDSfGTime = aValue(CurrentLocalTime) - (aValue(CurrentLocalTime) % 60); theApp.m_DSfGApi->Event_ArchivFillHinweis(locDSfGTime, MAX_MESSGAS_STREAM , true, GetDSfGErrorNr(HIN_NUR_DSFG_UHRZEIT_NEU)); } changeSystemTime(1); // So hat es der ERZ } } else { // Jetzt (keine viertel Stunde) kein Sommer-/Winterzeitwechsel oder Winter-/Sommerzeitwechsel möglich changeSystemTime(0); // So hat es der ERZ }