Hi,
Rudolf Koenig wrote:
>> Warum sind >1 Zeitzählung Deiner Ansicht nach sinnvoll?
>
> Ich frag mich auch, aber es gibt hier wohl Leute, die unbedingt auf einen fuer
> mich nicht-lesbaren-Zahl (nlZ) bestehen, aus fuer mich _relativ_ unwichtigen
> Gruenden:
>
> - Zeitdifferenze rechnen
> (man kann statt a-b immer noch time_diff(a,b) haben)
> - Doppelte Speicherung einmail um 2:00 im Herbst, beim Zeitwechsel.
DST-Handling hat mit der Zeitrepräsentation erst einmal wenig zu tun, oder?
Ich für meinen Teil kann nur sagen, daß ich nicht groß nachgeschaut habe,
ob es in Perl oder FHEM Unterstützung gibt für die Zeitdifferenzberechnung
basierend auf FHEM-Zeitwerten, daher habe ich einfach die Krücke über time()
gewählt:
if(defined($defs{$self}{PREV}{TIMESTAMP})) {
if($defs{$self}{PREV}{TIMESTAMP} > time()-5) {
if(defined($defs{$self}{PREV}{STATE})) {
if($defs{$self}{PREV}{STATE} eq $state) {
Log GetLogLevel($def->{NAME},5), sprintf("FHTTK skipping state $state as last similar telegram was received less than 5 (%d) secs ago", $defs{$self}{PREV}{STATE}, time()-$defs{$self}{PREV}{TIMESTAMP});
return "";
}
}
}
}
$defs{$self}{READINGS}{$reading}{TIME} zu parsen, dazu hatte ich nun wirk-
lich keine Lust, mit all den Ausnahmen, die man bei Sekunden, Minuten, Stunden
und Wochentagen, Monatsnummern und Jahren letztlich berücksichtigen muß.
(Vielleicht ist die Abstimmung darüber doch zu voreilig?)
Initial ging ich von [local]time() statt TimeNow() aus, weil TimeNow() genau
keinen Mehrwert für die interne Repräsentation bringt:
sub
TimeNow()
{
my @t = localtime;
return sprintf("%04d-%02d-%02d %02d:%02d:%02d",
$t[5]+1900, $t[4]+1, $t[3], $t[2], $t[1], $t[0]);
}
Anstatt also den Sekundenwert umständlich in Jahre, Monate, Monatstage,
Stunden, Minuten und Sekunden zu wandeln und diesen menschlichen Irrsinn
bei jeder Berechnung zwei(!)mal zu wiederholen (TimeNow()-Wert in Sekun-
den, Berechnen, Wert wieder ins TimeNow()-Format wandeln (durch FmtDate-
Time(), korrekt?)), wollte ich nur das Maschinendatum gespeichert wissen,
was "nur" bei jeder "Ausgabe in Richtung Mensch" ein FmtDateTime($var)
benötigen würde. KISS; Formatwandlung nur da, wo notwendig.
Soweit dazu. Daß time(), anders als gmtime()/localtime() aber Schalt-
zeiten nicht berücksichtigt, habe ich ehrlich gesagt verdrängt -- in-
sofern werde ich u. a. meinen bestehenden Code natürlich anpassen --;
da Date::Parse das Y2k38-Thema auch nicht löst ...
LIMITATION
Date::Parse uses Time::Local internally, so is limited to only parsing dates which result in valid values for Time::Local::timelocal. This generally means dates between 1901-12-17 00:00:00 GMT and 2038-01-16 23:59:59 GMT
... frage ich mich, im Frühjahr 2010, ob die Diskussion über Y2k38 nun
wichtig oder müßig ist; ich hatte eigentlich erwartet/gehofft, daß Perl
das Thema adressieren würde :(
Zu UTC vs. lokaler Zeit:
Wie schon einmal gesagt, für mich stellt sich das Zeitumstellungsproblem
nicht, da ich ggf. statt 02:00 eben 01:59 oder 03:01 wählen würde, sollte
ein Ausfall bzw. ein mehrmaliges Ausführen in einer Nacht für mich ein Thema
sein. Da ich als Mensch es nicht gewohnt bin, mein Zeitzonen zu arbeiten,
würde ich dazu tendieren, jede Zeitwert vom Benutzer als in der lokalen Zeit-
zone befindlich zu interpretieren. In dem Fall kann UTC UTC bleiben und die
Speicherung in lokaler Zeit erfolgen ...
Was spräche denn gegen ISO 8601 als Zeitformat i. V. m. "use Date::Parse;"?
Das hätte den Vorteil, daß die "maschinenlesbare" Zeitrepräsentation auch
noch "menschenlesbar" ist, dieses "maschinenlesbare" Format plattformüber-
greifend "as-is" gespeichert werden kann und über Date::Parse Wandlungs-
routinen bereit stehen, um auch Zeitidfferenzen berechnen zu können.
http://www.iso.org/iso/date_and_time_format
> * Date and time represents a specified time of a specified day. When use is made of the calendar date the representation is:
>
> YYYY-MM-DDThh:mm:ss
>
> where the capital letter T is used to separate the date and time components. Thus, for a very precise date and time, look at this:
>
> Example: 2003-04-01T13:01:02 represents one minute and two seconds after one o'clock in the afternoon of 2003-04-01.
Gut, wahrscheinlich kann man "str2time(TimeNow());" machen, was aber immer
noch "use Date::Parse;" voraussetzte. Da auch perlport ISO 8601 vorschlägt
(wenngleich in meiner Version zumindest /falsch ausgeführt/), sollte man das
IMHO beherzigen:
Time and Date
[...]
Don’t assume that the epoch starts at 00:00:00, January 1, 1970,
because that is OS- and implementation-specific. It is better to store
a date in an unambiguous representation. The ISO 8601 standard defines
YYYY-MM-DD as the date format, or YYYY-MM-DDTHH-MM-SS (that’s a literal
"T" separating the date from the time). [...]
(EPOCH)
>> Gedacht haben sie imho da nur eines: wir liefern das, was das OS unten drunter
>> liefert. Und zumindest lt. cpan sollte die MacOS-Epoche mit den letzten MacOS-
>> Dinosauriern aussterben:
>
> Dieser Fall ist mir zu hypothetisch (jemand wechselt von einem MacOS basierten
> fhem auf Unix/Windows, und will seinen alten Konfig portieren), das Problem
> kann gerne beim Wechsler bleiben, da schreibe ich lieber ein FAQ/HOWTO.
Hmm? Nutzt noch irgendwer MacOS (nicht(!) MacOS X)? Und was hat eine maschinen-
lesbare Zeitrepräsentation mit dem Konfigfile zu tun? Niemand wollte, daß in der
Konfiguration nun mit Sekunden seit der Epoche gearbeitet wird,
define at_EndOfDays at 1272442532 set WeltuntergangsLED on
wäre etwas zu viel verlangt -- und ein Rückschritt auf mehreren Ebenen ;)
Du vermischt hier was. Aber ISO 8601 als internes Zeitformat i. V. m.
"use Date::Parse;" löst eigentlich alle diese Themen, oder? ;)
kai