Funktion zur Berechnung des Wochentages


  • Mod

    ... und nun für Fanatiker:

    http://de.wikipedia.org/wiki/Schaltsekunde

    Die Anweisung, eine Schaltsekunde einzufügen, wird immer dann gegeben, wenn für die nächste Zukunft zu erwarten ist, dass der Unterschied zwischen UTC und UT1 über 0,9 Sekunden anwächst. Nach 23:59:59 UTC der genannten Tage wird eine zusätzliche Sekunde bei 23:59:60 eingefügt, bevor die Uhr auf 00:00:00 des Folgetages vorrückt. Das bedeutet, dass der Tag mit der Schaltsekunde aus 86401 Atomsekunden, statt der üblichen 86400, besteht.

    http://de.wikipedia.org/wiki/Erdrotation

    Die durchschnittliche Dauer einer Umdrehung bezüglich des als ruhend angenommenen kosmischen Hintergrundes – der mittlere siderische Tag – beträgt 23 h 56 min 4,10 s ... Die Zeitspanne, die die Erde braucht, um nach einer Umdrehung wieder dieselbe Stellung bezüglich des Frühlingspunktes einzunehmen, ist ein Sterntag. Deshalb dauert ein Sterntag nur 23 h 56 min 4,09 s. Die Präzession der Erde hingegen ist der Grund dafür, dass ein siderischer Tag etwa 8 Millisekunden länger ist als ein Sterntag.



  • Erhard Henkes schrieb:

    Jetzt muss ich dich in die Schranken weisen. 😃
    Das ist ja ein Denken wie bei "1984".

    So machen wir es, damit wir die Zeit vor 2000 auch korrekt abdecken:

    static uint16_t days[12] = {  0,  31,  59, 90, 120, 151, 181, 212, 243, 273, 304, 334};
    
    static bool isLeapyear(uint16_t year)
    {
        return (year % 4 == 0) && ((year % 100 != 0) || (year % 400 == 0));
    }
    
    // Gregorian calender started 15th October 1582
    static uint8_t calculateWeekday(uint16_t year, uint8_t month, int32_t day)
    {
        day += 6; // 1.1.1600 was a saturday
        day += (year/*-1600*/) * 146097.0/400.0 + days[month-1];	
    
        if (isLeapyear(year) && (month < 2 || (month == 2 && day <= 28)))
        {
            day--;
        }
    
        return ( day % 7 + 1 );
    }
    

    Die Fließkommaoperationen könnte man sich doch bei der Variante sparen, oder?



  • Mr X schrieb:

    Die Fließkommaoperationen könnte man sich doch bei der Variante sparen, oder?

    Sagen wir mal, wir wollen nur die Division durch 100 bezahlen. Die anderen sind dann nur /4 und sehr billig.
    jhd=jahr/100;//bezahlt
    rest=jahr%100;//gibt es kostenlos dazu
    Jedes Jahr hat 365 Tage. tage=jahr*365;
    Jedes vierte Jahr hat einen mehr. tage+=jahr/4;
    Jedes hundertste hat einen weniger. tage-=jhd;
    Jedes vierhundertste hat einen mehr. tage+=jhd/4.

    Für die Schaltjahresberechnung haben wir schon zwei Divisionen bezahlt. Die könnte man wohl einsparen, wenn man sich die Variablen jhd und rest teilt; es bleibt nur noch eine Division übrig, die man insgesamt bezahlt. Und die wird zu einer Multiplikation, weil der Divisor compilezeitkonstant ist.



  • Auf Deiner Webseite hat Du eine Unterseite zur Chemie.
    Meine Anmerkung zum 1. Absatz "Physik liefert die Elementarteilchen für die Chemie":
    Nein, so kann man das nicht sehen, sondern:
    Chemie ist die Physik der ersten Elektronenschale 😃
    (Bitte nicht nach Orbitalen fragen 🤡 )

    Zu Deinem Datumsproblem, empfehl ich Dir:
    http://manfred.wilzeck.de/Datum_berechnen.html


  • Mod

    Chemie ist die Physik der ersten Elektronenschale

    Schau dir mal Elektronen in inneren d-Schalen an bei Übergangsmetallkomplexen (Ligandenfeldtheorie), dann siehst du, dass deine Aussage nicht korrekt ist. 😉

    Zu Deinem Datumsproblem, empfehl ich Dir:
    http://manfred.wilzeck.de/Datum_berechnen.html

    ... und ich dachte immer meine Homepage wäre schwierig lesbar. Das ist echt der Hammer. Die muss gut sein. 😉

    Übrigens haben wir kein Problem, unsere Funktion arbeitet korrekt. Das Hauptproblem ist noch, dass sie zu oft aufgerufen wird. Das werden wir ändern. Wenn diese später einmal pro Tag angesprochen wird und nicht jede Sekunde, benötigen wir da keine ausgefeilte Performance-Optimierung. 🙂



  • Chemie ist die Physik der ersten Elektronenschale

    Schau dir mal Elektronen in inneren d-Schalen an bei Übergangsmetallkomplexen (Ligandenfeldtheorie), dann siehst du, dass deine Aussage nicht korrekt ist. 😉

    in der schule wird aber immer gesagt

    Chemie ist die Physik der ersten Elektronenschale

    👍 👍 😃



  • Physiker sehen das im Allgemeinen auch so.
    Besonders Feststoffphysiker.
    Aber Physiker pflegen auch ein spezielles Verhältnis zu Chemikern. 😉


  • Mod

    in der schule wird aber immer gesagt

    Da reden Lehrer, die nehmen es nicht so genau und sind zumeist mehrere Jahrzehnte hinter dem aktuellen Wissensstand zurück. 😃



  • einer von denen glaube ich nicht 😃


  • Mod

    MrX hat auf integer umgebaut:

    static uint8_t calculateWeekday(uint16_t year, uint8_t month, int32_t day)
    {
        day += 6; // 1.1.1600 was a saturday
        day += (year/*-1600*/ * 146097)/400 + days[month-1];	
    
        if (isLeapyear(year) && (month < 2 || (month == 2 && day <= 28)))
        {
            day--;
        }
    
        return (day % 7 + 1);
    }
    

    Kleine Testvariante:

    #include "stdio.h"
    
    int days[12] = {0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334};
    
    int isLeapyear(int year)
    {
        return (year % 4 == 0) && ((year % 100 != 0) || (year % 400 == 0));
    }
    
    int calculateWeekdayFloat(int year, int month, int day)
    {
        day += 6; // 1.1.1600 was a saturday
        day += year/*-1600*/ * 365.2425 + days[month-1];
    
        if (isLeapyear(year) && (month < 2 || (month == 2 && day <= 28)))
        {
            day--;
        }
    
        return (day % 7 + 1);
    }
    
    int calculateWeekdayInteger(int year, int month, int day)
    {
        day += 6; // 1.1.1600 was a saturday
        day += (year/*-1600*/ * 146097)/400 + days[month-1];
    
        if (isLeapyear(year) && (month < 2 || (month == 2 && day <= 28)))
        {
            day--;
        }
    
        return (day % 7 + 1);
    }
    
    int main()
    {
        int y,m,d;
        for (y=0; y<=12000; y++)
        {
            printf("%u ", y);
            for (m=1; m<=12; m++)
            {
                for (d=1; d<=31; d++)
                {
                    if (calculateWeekdayFloat(y,m,d) == (calculateWeekdayInteger(y,m,d))){}
                    else
                    {
                        printf("fehler ");
                        for(;;);
                    }
                }
            }
        }
    }
    

    Dürfte also klappen.


Anmelden zum Antworten