Hallo,
ich habe einen Geburtstagskalender eingebunden. Darin sind auch Personen , die vor 1970 geboren sind. Ein solcher Geburtstag ist eine jährlich wiederkehrender Eintrag im Kalender. Das Modul 57_Calendar.pm berechnet daraus die nächste Startzeit (also den Geburtstag im Jahr 2015, wenn er dieses Jahr noch nicht war oder halt für 2016, wenn er bereits stattfand). Dabei verwendet die Funktion sub tm die fhem Funktion fhemTimeLocal aus der fhem.pl. Diese wiederum ruft dann fhemTimeGm auf.
Es sollen die Skunden (epoch) seit Thu Jan 1 01:00:00 1970 berechnet werden. Und dazu notwendig ist auch die Berechnung, wieviel Schaltjahre es bis zu dem gegebene Datum gibt.
Implementiert ist:
my $leapyears= int(($year-1969)/4) - int(($year-1901)/100) + int(($year-1601)/400);
Diese Formel liefert aber eine falsche Anzahl von Schaltjahren für Daten, die vor 1970 sind.
ich hab mal folgendes mit Erfolg ausprobiert:
my $leapyears_date = ( int(($year-1)/4) - int(($year-1)/100) + int(($year-1)/400) ); # Schaltjahre seit 01.01.01 00:00:00 bis $year
my $leapyears_1970 = ( int((1970-1)/4) - int((1970-1)/100) + int((1970-1)/400) ); # Schaltjahre seit 01.01.01 00:00:00 bis 1970
my $leapyears = $leapyears_date - $leapyears_1970; # Schaltjahre seit 1970 (positiv, wenn größer 1970 - negativ, wenn kleiner 1970)
Habs mal tabellarisch dargestellt. Die alte Formel verrechnet sich um 1 Schaltjahr.
Jahr Anzahl Schaltjahre
alte neue
Formel Formel
1946 -5 -6
1947 -5 -6
1948 -5 -6
1949 -5 -5
1950 -4 -5
1951 -4 -5
1952 -4 -5
1953 -4 -4
1954 -3 -4
1955 -3 -4
1956 -3 -4
1957 -3 -3
1958 -2 -3
1959 -2 -3
1960 -2 -3
1961 -2 -2
1962 -1 -2
1963 -1 -2
1964 -1 -2
1965 -1 -1
1966 0 -1
1967 0 -1
1968 0 -1
1969 0 0
1970 0 0
1971 0 0
1972 0 0
1973 1 1
1974 1 1
1975 1 1
1976 1 1
1977 2 2
1978 2 2
1979 2 2
1980 2 2
Das Kalendermodul macht z.B. while($self->{end} < $t and $self->advanceToNextOccurance()) { ; }. Darin wir auch tm() verwendet, und zwar viele male.
Daraus folgen ergebliche Abweichungen vom richtigen geburtstag.
Könnte diese Korrektur der Schlatjahre in die offizielle fhem.pl aufgenommen werden?
ich finde der Beitrag hätte besser hier (http://forum.fhem.de/index.php/board,44.0.html) hin gepasst.
Ich weiß nicht ob das einer von den zuständigen Entwicklern bei Anfängerfragen mitbekommt.
Gruß Otto
Hi Otto123,
habs dorthin dorthin (http://forum.fhem.de/index.php/board,44.0.html) unter fhem und Datum älter als 1970 (http://forum.fhem.de/index.php/topic,38610.0.html) kopiert, wie du vorgeschlagen hast.
Hi,
und da hat es doch ziemlich schnell gezündet :)
Gruß Otto