Uhr mit Sommer-/Winterzeit



  • Hallo,

    folgender Code ist aus einem Beispiel, das ich eigentlich nur zu Bitfeldern machen wollte, entstanden:

    #include <iostream>
    #include <iomanip>
    #include <windows.h>
    #include <ctime>
    using timestruct = _TIME_ZONE_INFORMATION;
    
    int main()
    {
    	struct times
    	{
    		unsigned int min : 6;
    		unsigned int sec : 6;
    		unsigned int hour : 5;
    	}t;
    
    	long long a;
    
    	time_t x = time(0);
    	tm *tx = localtime(&x);
    
    	t.sec = x % 60;
    	a = x / 60;
    	t.min = a % 60;
    	a = a / 60;
    	t.hour = a % 24;
    
    	timestruct ts;
    
    	GetTimeZoneInformation(&ts);
    	if (tx->tm_mon <= ts.DaylightDate.wMonth)
    	{
    		if (tx->tm_mon == ts.DaylightDate.wMonth)
    		{
    			if (tx->tm_mday < ts.DaylightDate.wDay)
    			{
    				t.hour++;
    			}
    		}
    		else
    		{
    			t.hour++;
    		}
    	}
    	else if (tx->tm_mon >= ts.StandardDate.wMonth)
    	{
    		if (tx->tm_mon == ts.StandardDate.wMonth)
    		{
    			if (tx->tm_mday > ts.StandardDate.wDay)
    			{
    				t.hour++;
    			}
    		}
    		else
    		{
    			t.hour++;
    		}
    
    	}
    
    	do
    	{
    		std::cout << std::setfill('0') << std::setw(2) << t.hour << " : " << std::setfill('0') << std::setw(2) << t.min << " : " << std::setfill('0') << std::setw(2) << t.sec << std::endl << std::endl;
    
    		t.sec++;
    		if (t.sec == 60)
    		{
    
    			t.sec = 0;
    			t.min++;
    			if (t.min == 60)
    			{
    				t.min = 0;
    				t.hour++;
    				if (t.hour == 24)
    				{
    					t.hour = 0;
    				}
    
    			}
    
    		}
    
    		Sleep(1000);
    
    	} while (true);
    
    	std::cin.get();
    	return 0;
    }
    

    Da es mir für das bisschen, das das macht, etwas umständlich vorkommt, wollte ich fragen, ob es dafür nicht auch bessere Möglichkeiten gibt.
    Auch, ob das wirklich funktionieren würde, da ich nur sagen kann, dass es für den heutigen Tag funktioniert.

    Danke euch schon einmal. 🙂

    Edit: Gerade folgenden Fehler bekommen, obwohl es zuvor bereits problemlos ging. Was genau hat das denn zu bedeuten? Ich benutze Visual Studio Community 2017 RC.
    error C4996: 'localtime': This function or variable may be unsafe. Consider using localtime_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS.
    localtime_s() funktioniert aber irgendwie auch nicht.



  • Skylac06 schrieb:

    Auch, ob das wirklich funktionieren würde, da ich nur sagen kann, dass es für den heutigen Tag funktioniert.

    Das funktioniert nicht, auch nicht für den heutigen Tag, aus mehreren Gründen.

    localtime liefert dir eine Sommerzeit-korrigierte Zeit, es ist also gar nicht notwendig, das selbst zu berechnen.
    Zudem ist die Berechnung falsch. Nicht überall wird Sommerzeit verwendet, und sie ist auch nicht immer genau eine Stunde.

    Deine Annahme, dass DaylightDate vor StandardDate liegt, funktioniert vermutlich auch nur auf der Nordhalbkugel.

    Dein Programm berücksichtigt keinen Sommerzeitwechsel, während es läüft.

    Und schließlich ist Sleep nicht für solche Aufgaben geeignet. Es wartet mindestest die angegebene Zeit, nicht genau.



  • MFK schrieb:

    localtime liefert dir eine Sommerzeit-korrigierte Zeit, es ist also gar nicht notwendig, das selbst zu berechnen.
    Zudem ist die Berechnung falsch. Nicht überall wird Sommerzeit verwendet, und sie ist auch nicht immer genau eine Stunde.

    Du meinst über tm_sec, tm_min und tm_hour? Daran habe ich ehrlich gesagt gar nicht gedacht und auch nicht gewusst, dass die Sommerzeit bereits berechnet wird.

    Zu meinem Problem mit localtime habe ich nur die Parameter bei localtime_s vertauscht.

    time_t x = time(0);
    	tm tx;
    	localtime_s(&tx, &x);
    

    So klappt es.

    Und schließlich ist Sleep nicht für solche Aufgaben geeignet. Es wartet mindestest die angegebene Zeit, nicht genau.

    Was ist denn hier besser geeignet? Mir ist keine andere Funktion, die ähnliches macht, bekannt.


Log in to reply