fhem und Datum älter als 1970

Begonnen von nccfast, 28 Juni 2015, 08:28:18

Vorheriges Thema - Nächstes Thema

nccfast

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?




Otto123

ich finde der Beitrag hätte besser hier hin gepasst.
Ich weiß nicht ob das einer von den zuständigen Entwicklern bei Anfängerfragen mitbekommt.
Gruß Otto
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

nccfast

#2
Hi Otto123,
habs dorthin dorthin unter fhem und Datum älter als 1970 kopiert, wie du vorgeschlagen hast.

Otto123

Hi,

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

Gruß Otto
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz