staging.inyokaproject.org

Für diese Funktion musst du eingeloggt sein.

Perl Vormonat ermitteln

Status: Gelöst | Ubuntu-Version: Ubuntu MATE 19.10 (Eoan Ermine)
Antworten |

wenze

Avatar von wenze

Anmeldungsdatum:
9. August 2006

Beiträge: 161

Hallo,

ich möchte in der Form: YYYY-MM den Vormonat ermitteln. Wie kann ich das nur mit den Core Modulen?

Danke

seahawk1986

Anmeldungsdatum:
27. Oktober 2006

Beiträge: 11278

Das sollte z.B. so gehen (vgl. Dokumentation zu localtime):

1
2
3
4
5
6
7
#!/usr/bin/perl                                                           
($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime();                                                                                   
if (--$mon lt 0) {
  --$year;
  $mon = 11;
}                                                                                                                                   
printf("%04d-%02d\n", $year + 1900, $mon + 1);

Edit: Monatsanzeige gefixt, Perl zählt die Monate von 0 bis 11 🙄

wenze

(Themenstarter)
Avatar von wenze

Anmeldungsdatum:
9. August 2006

Beiträge: 161

Besten Dank!

apt-ghetto

Anmeldungsdatum:
3. Juni 2014

Beiträge: 2943

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#!/usr/bin/perl

use warnings;
use strict;

my @months = qw ! Januar
                  Februar
                  März
                  April
                  Mai
                  Juni
                  Juli
                  August
                  September
                  Oktober
                  November
                  Dezember
                !;


# 1-based month
foreach my $month (01..12) {
    my $year = 2020;
    --$year if not --$month;
    print "$year-$months[--$month % 12]\n";
}

# perldoc -f localtime
# 0-based month
my ($current_year, $current_month) = (localtime)[5,4];
$current_year += $current_month ? 1900 : 1899;
print "\nVormonat: $months[--$current_month % 12] $current_year\n";

wenze

(Themenstarter)
Avatar von wenze

Anmeldungsdatum:
9. August 2006

Beiträge: 161

Da fällt mir doch etwas auf,

das ganz funktioniert ja nicht so einfach, wenn z.B. Januar 2020 habe. Der Vormonat ist ja dann das Vorjahr.

Also 2019-12.

Ich muss, wenn der Monat Januar (month = 0) also auch noch $year -1 rechnen?!

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13242

wenze schrieb:

Ich muss, wenn der Monat Januar (month = 0) also auch noch $year -1 rechnen?!

Klar. Aber warum eigentlich in Perl?

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
#!/bin/bash

for input in 2019-{01..12}; do
  echo "input: $input"
  year=${input%%-*}
  month=${input##*-}
  month=${month##0}

  month=$((month - 1))

  if [ $month -eq 0 ]; then
    month=01
    year=$((year - 1))
  fi

  echo "output: $year-$month"
done

seahawk1986

Anmeldungsdatum:
27. Oktober 2006

Beiträge: 11278

wenze schrieb:

das ganz funktioniert ja nicht so einfach, wenn z.B. Januar 2020 habe. Der Vormonat ist ja dann das Vorjahr.

Also 2019-12.

Ich muss, wenn der Monat Januar (month = 0) also auch noch $year -1 rechnen?!

Ja, das macht mein Vorschlag in der oben gezeigten Version ja auch - erst dekrementiert er die Variable $mon, dann schaut er, ob sie einen Wert kleiner Null hat. Wenn das der Fall ist, dekrementiert er das Jahr und setzt $mon auf den Wert 11 für Dezember: seahawk1986 schrieb:

1
2
3
4
if (--$mon lt 0) {
  --$year;
  $mon = 11;
}                                                                                                                                   

Damit man es besser testen kann, habe ich es mal umgebaut:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
#!/usr/bin/perl
use warnings;
use strict;

my $mon = 0;
my $year = 2020;

if (--$mon lt 0) {
      --$year;
      $mon = 11;
}
printf("%04d-%02d\n", $year + 1900, $mon + 1);

rklm schrieb:

Aber warum eigentlich in Perl?

Warum nicht GNU date statt einem Shell-Skript?

date -d "today -1 month" +"%Y-%m" 

wenze

(Themenstarter)
Avatar von wenze

Anmeldungsdatum:
9. August 2006

Beiträge: 161

Perl? - weil mein SQL nicht so gut ist. Perl, weil ich es plattformunabhängig machen möchte. Da, finde ich, ist es mit Perl immer noch am einfachsten. Ich habe über die Jahre schon einiges in Perl realisiert (Insatllationsautomaten, Backups, Datensammler). Nach so 4 Jahren kompletten Abstand ist leider aber so einiges weg. :-/

Mit dem Datum vervollständige ich mein SQL, die Ausgabe wird dann per Mail versendet. So der Plan

Danke noch einmal für die Hilfe

seahawk1986

Anmeldungsdatum:
27. Oktober 2006

Beiträge: 11278

Mit MySQL/MariaDB wäre das z.B. auch schnell erledigt:

1
SELECT DATE_FORMAT(NOW() - INTERVAL 1 MONTH, '%Y-%m');
Antworten |