Hauptmenü

[gelöst] Datum zu Wochentag

Begonnen von Brad Majors, 20 Januar 2023, 12:59:36

Vorheriges Thema - Nächstes Thema

Brad Majors

#15
ok, und wenn ich jetzt den Parameter sprich fc0_date, fc1_date eintragen will?

Wie mach ich das am einfachtsten?
Raspberry Pi. * Eigenbau Nano Cul 433 und 866 * EnOcean TCM_3 * Netatmo * Max! Thermostate * SMA PV Inverter * Zigbee über ConBeeII / Phoscon

betateilchen

Du musst die Funktion so umbauen, dass sie aus einem beliebigen Datum den Wochentag ermitteln kann.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

Brad Majors

Ich versuche es mit der hier

# Liefert Wochentag (0 (So) - 6 (Sa)).
# Param: Datum ('24.12.2015')

sub getDayOfWeek($){ 
my $datum_str = shift || return -1; 
my($day, $month, $year) = split /\./, $datum_str; 
return -1 if $day < 1 or $day > 31; 
return -1 if $month < 1 or $month > 12; 
my $time = timelocal(0, 0, 0, $day, $month - 1, $year); 
return (localtime($time))[6]; 
}



attr WetterProplanta userReadings fc0_date_WD:fc0_date.* {getDayOfWeek (ReadingsVal($name,'fc0_date','nA'))}, fc1_date_WD:fc1_date.* {getDayOfWeek (ReadingsVal($name,'fc1_date','nA'))}

Dann bekomme ich schon mal den Tag 5 oder 6 angezeigt. Jetzt muß ich nur noch die 5 oder 6 in Freitag oder Samstag umwandeln.
Hast du eine Idee?
Raspberry Pi. * Eigenbau Nano Cul 433 und 866 * EnOcean TCM_3 * Netatmo * Max! Thermostate * SMA PV Inverter * Zigbee über ConBeeII / Phoscon

Otto123

#18
ZitatDann bekomme ich schon mal den Tag 5 oder 6 angezeigt. Jetzt muß ich nur noch die 5 oder 6 in Freitag oder Samstag umwandeln.
Darauf nicht, aber die Frage war doch ohne den Zwischenschritt?

Das Beispiel aus dem Wiki macht genau das  ;) (Antwort #1)
sub wochentag {
    my $date = shift;
    my ($d,$m,$y) = split(/\./,$date);
    $m-=1;
    return strftime("%A",localtime(timelocal('0','0','0',$d,$m,$y)));
}


Aufruf Beispiel {wochentag('21.01.2023')} -> Samstag

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

TomLee

Stimmt, der Schlaumeier hat sich das die Tage gar nicht richtig durchgelesen und nur gewundert wie das sein kann wenn nix übergeben wird in der Routine und gedankenlos einfach so hingenommen.

Als Alternative kann ich das hier anbieten, das ist die Variante aus dem Wiki, die klappt wenn du im System auf de_DE.utf8 gestellt hast.

sub wochentag {
my $p = shift;
    my ($d,$m,$y) = split(/\./,$p);
    $m-=1;
    return strftime("%A",localtime(timelocal('0','0','0',$d,$m,$y)));
}


Wie man das mit dem vorgegebenem Array (das du die kurze Variante der Tage verwenden kannst) macht weiß ich auf Anhieb auch nicht, zieh ich mir noch nicht einfach aus dem Ärmel und muss/werd mich mit beschäftigen.

betateilchen

Zitat von: Otto123 am 20 Januar 2023, 16:11:32
Aufruf Beispiel {wochentag('21.01.2023')} -> Samstag

Ah, noch ein Schlaumeier mit einer "Guten Idee" - ich geh mal noch mehr Popcorn machen und setze mich wieder auf mein Sofa.

könnte ein langer Abend werden  8)
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

betateilchen

Zitat von: yersinia am 20 Januar 2023, 16:13:33
Die Funktion erwartet ein Datum in dd.mm.yyyy und gibt den Wochentag in Text lang zurück.

oh, noch einer...
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

Otto123

Das war doch aber die initiale Frage?
ZitatWie bekomme ich jetzt dem beigebracht das anstelle 20.01.2023 dort Freitag erscheint.
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

Brad Majors

#23
Otto das war die Lösung :) Danke schön.

sub weekday{
    my $date = shift;
    my ($d,$m,$y) = split(/\./,$date);
    $m-=1;
    return strftime("%A",localtime(timelocal('0','0','0',$d,$m,$y)));
}


Habe ihn in weekday umbenannt da ich die sub Wochentag schon hatte.

Und jetzt macht er was ich will

20.01 > Friday
21.01 > Saturday

aber mit dem englischen kann ich leben.
Raspberry Pi. * Eigenbau Nano Cul 433 und 866 * EnOcean TCM_3 * Netatmo * Max! Thermostate * SMA PV Inverter * Zigbee über ConBeeII / Phoscon

betateilchen

Zitat von: Otto123 am 20 Januar 2023, 16:21:41
Das war doch aber die initiale Frage?

Ja, die Frage war nach Freitag. Aber jetzt kommt halt nicht Freitag, sondern Friday.
Insofern ist für mich die ursprüngliche Frage nicht beantwortet.

Daran ändert auch das hier für mich nichts:

Zitat von: Brad Majors am 20 Januar 2023, 16:28:56
aber mit dem englischen kann ich leben.

Die ursprüngliche Funktion Wochentag wurde ja vor kurzem genau deshalb vorgeschlagen, weil man eben mit dem englischen NICHT leben wollte, sondern die Namen unabhängig von installierten locales haben wollte.

Auch in yersinias inzwischem gelöschten Vorschlag wäre zwar der "Wochentag in lang" rausgekommen, aber in deutsch auch nur unter der Voraussetzung, dass die locale=DE überhaupt installiert ist. Das dürfte bei >90% aller raspberries aber nicht gegeben sein.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

TomLee

#25
So gehts mit dem Array:

sub wochentag{
my $v = shift;
my ($d,$m,$y) = split(/\./,$v);
$m-=1;
my @weekdays = qw(So Mo Di Mi Do Fr Sa);
return $weekdays[((localtime(timelocal('0','0','0',$d,$m,$y)))[6])];
}


Hier braucht man die "Schleifchen".

Otto123

Zitat von: betateilchen am 20 Januar 2023, 16:33:08
Ja, die Frage war nach Freitag. Aber jetzt kommt halt nicht Freitag, sondern Friday.
Bei mir kommt schon Freitag :) das er die locale nicht installiert/konfiguriert hat kann ich ja nicht wissen.
Man sollte das eigentlich im System einmal richtig machen, anstatt an all möglichen Ecken Sonderlocken zu stricken.
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

TomLee

Besser erstmal so das nix zurückgegeben wird, wenn man nix übergibt:

sub wochentag{
my $v = shift || return;
my ($d,$m,$y) = split(/\./,$v);
$m-=1;
my @weekdays = qw(So Mo Di Mi Do Fr Sa);
return $weekdays[((localtime(timelocal('0','0','0',$d,$m,$y)))[6])];
}


Die Variante das per default das heutige Datum genommen wird kommt mir noch.

TomLee

ZitatBei mir kommt schon Freitag :) das er die locale nicht installiert/konfiguriert hat kann ich ja nicht wissen

Am/Im ersten Beitrag kann man sich das ableiten, mir wars auch nicht aufgefallen.

betateilchen

Zitat von: Otto123 am 20 Januar 2023, 16:44:41
das er die locale nicht installiert/konfiguriert hat kann ich ja nicht wissen.

Zitat von: TomLee am 20 Januar 2023, 16:54:28
Am/Im ersten Beitrag kann man sich das ableiten, mir wars auch nicht aufgefallen.

Genau. Wenn man den Thread aufmerksam lesen würde, bevor man irgendeine Antwort raushaut, schon...

Es geht doch hier im Forum nicht darum, möglichst immer der Erste zu sein, der eine Antwort gibt.
Eine qualifizierte Antwort eine halbe Stunde später wäre oft sehr viel hilfreicher.

Dieses Streben nach "ich habe die erste Antwort gegeben, ich bin der Größte" nervt mich hier im Forum immer mehr.
Es wird viel zu wenig Zeit darauf verwendet, das eigentliche Problem eines Fragestellers überhaupt zu erfassen.

Und es ist immer die gleiche Handvoll Leute, die sich durch dieses kontraproduktive Verhalten quer durchs Forum auszeichnet.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!