FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: nccfast am 28 Juni 2015, 08:28:18

Titel: fhem und Datum älter als 1970
Beitrag von: nccfast am 28 Juni 2015, 08:28:18
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?



Titel: Antw:fhem und Datum älter als 1970
Beitrag von: Otto123 am 28 Juni 2015, 12:00:02
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
Titel: Antw:fhem und Datum älter als 1970
Beitrag von: nccfast am 28 Juni 2015, 13:10:26
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.
Titel: Antw:fhem und Datum älter als 1970
Beitrag von: Otto123 am 28 Juni 2015, 20:56:06
Hi,

und da hat es doch ziemlich schnell gezündet :)

Gruß Otto