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)

20131108_Diagnose.docx (1.5 MB ) - added by Melanie Hermann 12 years ago.

Download all attachments as: .zip

Change History (5)

comment:1 by Melanie Hermann, 12 years ago

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
}

comment:2 by Melanie Hermann, 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
}

Last edited 12 years ago by Melanie Hermann (previous) (diff)

comment:3 by Melanie Hermann, 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 Melanie Hermann, 12 years ago

Resolution: fixed
Status: newclosed

by Melanie Hermann, 12 years ago

Attachment: 20131108_Diagnose.docx added
Note: See TracTickets for help on using tickets.