Funktion zur Berechnung des Wochentages



  • Da sich der Kalender alle 400 Jahre wiederholt, kannste statt j-2000 auch j-1600 schreiben. Oder j-0.


  • Mod

    Danke für den Hinweis. Mit meinem Win XP SP3 kann ich nur von 1.1.1980 bis 31.12.2099 experimentell mit VBox testen. Qemu macht die Grätsche (schwach gebastelt), und GNU GCC versagt beim Compilieren, wenn die Zeit aus den Fugen ist. 😃

    Habe gerade bei meinem Sohn Win 7 gecheckt, selber Murks: 1980 - 2099. 😃


  • Mod

    http://www.thkoehler.de/midnightblue/m_kal.htm

    Volkard hat Recht. 1.1.1600 ist ein Samstag. 🙂

    @Volkard: 0 ist allerdings nicht brauchbar wegen dem 15.10.1582 (Beginn der gregorianischen Zeitrechnung). Da hat der gute Gregor 10 Tage ausgelassen (4.10. ==> 15.10.1582 ).



  • Erhard Henkes schrieb:

    @Volkard: 0 ist allerdings nicht brauchbar wegen dem 15.10.1582 (Beginn der gregorianischen Zeitrechnung). Da hat der gute Gregor 10 Tage ausgelassen (4.10. ==> 15.10.1582 ).

    Doch.
    Es geht immernoch nur darum, den gregorianischen Kalender abzubilden. Für Eingaben nach dem 15.10.1582 klappt doch alles mit j-0.


  • Mod

    Hast Recht.

    // 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];
    

    So könnte man das evtl. machen, damit Theorie und Praxis zu ihrem Recht kommen.



  • Sogar

    day += 6; // 1.1.0 was a saturday
    

    wobei hier das "was" nicht "war", sondern "wäre" heißt, wenn es da den greg Kalender schon gegeben hätte und wenn es ein Jahr 0 gäbe.

    Ich würde einfach alle gregorianisch lassen. Daten vorher werden halt falsch berechnet. Muß ins User-Handbuch.


  • Mod

    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 );
    }
    


  • Aber ich glaube, es wird doch

    static uint8_t calculateWeekday(uint16_t year, uint8_t month, int8_t day){
       return (calculateDaysFromDate(year,month,day)+3)%7;
    }
    

    Man will ja auch die Differenz zwischen zwei Daten ausrechnen können. DIe +3 ist geraten. Das %7, damit Tage bei 0 beginnen wie rechtschaffene enums und Arrayindizes.


  • Mod



  • Oder so: Die Schaltjahre wiederholen sich alle 400 Jahre.
    Diese 400 Jahre haben 365.2425*400=146097 Tage.
    Und 146097 ist zufällig durch 7 teilbar.


  • Mod

    Right Sir! 🙂


  • 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 😃


Anmelden zum Antworten