Wie überprüfe ich, welche Jahre Schaltjahre sind?

19

Wie kann ich in einem Linux-Terminal herausfinden, welche Schaltjahre zwischen 2014 und 2020 liegen?

Gibt es eine Möglichkeit, mit Code wie $cal- irgendetwas sofort zu zeigen, welche Jahre Schaltjahre zwischen 2014 und 2020 sind?

Lee
quelle

Antworten:

39

Sie können den dateExit-Code von verwenden, um nach einem Schaltjahr zu datesuchen. Dabei müssen Sie darauf vertrauen, dass ein Exit-Code ungleich 0 für ein ungültiges Datum generiert wird. Offensichtlich gibt es in einem Jahr ohne Schaltjahr keinen 29. Februar:

date -d $year-02-29 &>/dev/null
echo $?

als eine Funktion:

isleap() { date -d $1-02-29 &>/dev/null && echo is leap || echo is not leap; }

Verwendung:

$ isleap 2019
is not leap

$ isleap 2020
is leap

Was Ihre Frage betrifft:

Wie kann ich in einem Linux-Terminal herausfinden, welche Schaltjahre zwischen 2014 und 2020 liegen?

echo "Leap years between 2014 and 2020:";
for y in {2014..2020}; do
    date -d $y-02-29 &>/dev/null && echo $y;
done
pLumo
quelle
warum dies nicht funktioniert in Mac Terminal
Lee
Ich hoffe, Sie haben auf ask ubuntu nicht nach einer Lösung für Mac gefragt ... Siehe hierzu den Befehl osx date .
pLumo
9

Nur eine Variante der Antwort von @ RoVo ...

for a in {2014..2020}
do 
  date -d $a-02-29 +"%Y" 2>/dev/null
done

date -d $a-02-29 +"%Y" 2> /dev/null Setzt das Datum auf den 29. Februar und gibt das Jahr aus, wobei auftretende Fehler ignoriert werden.

wjandrea
quelle
3
Oder sogarseq -f "%g-02-29" 2014 2020 | date -f- +"%Y" 2>/dev/null
Digital Trauma
@DigitalTrauma: sehr cool!
7

Hier bei Stack Overflow bot anubhava eine elegante Lösung :

#!/bin/bash
(( !($1 % 4) && ( $1 % 100 || !( $1 % 400) ) )) &&
echo "leap year" || echo "not a leap"
exit 0

Speichern Sie die oben genannten Informationen in einer Textdatei mit dem Namen isleap.

Vergessen Sie nicht, die Ausführungsberechtigung festzulegen:

chmod +x isleap

Probier es aus:

$ ./isleap 1900
not a leap
$ ./isleap 2000
leap year
abu_bua
quelle
Das ist die richtige Antwort. Die anderen, die von einer beliebigen Implementierung im dateBefehl abhängen, sind Hacks.
DocSalvager
3

Wenn Sie sich nicht auf einige zufällige „arkane“ Eigenschaften von Schaltjahren verlassen möchten (wie die Teilbarkeit, die Anzahl der Tage in einem Jahr oder die Existenz eines bestimmten Tages), sollten Sie eine Programmiersprache mit einer geeigneten Kalenderbibliothek verwenden Funktion. Ich empfehle Pythons 1, 2 :calendar.isleap()

#!/usr/bin/python3
import sys
import traceback
import calendar

try:
    year = int(sys.argv[1])
    is_leap = calendar.isleap(year)
except:
    traceback.print_exc()
    sys.exit(2)

print(is_leap)  # Print the year’s leap status
sys.exit(not is_leap)  # Exit program with "success" if leap and "failure" otherwise

Verwendung:

$ python3 is_leap.py 2000
True
$ python3 is_leap.py 2100
False

Oder als Einzeiler (ohne richtige Fehlerbehandlung):

$ python3 -c 'import sys, calendar; print(calendar.isleap(int(sys.argv[1])))' 2000
True
$ python3 -c 'import sys, calendar; sys.exit(not calendar.isleap(int(sys.argv[1])))' 2000
$ echo $?
0

1 Ich bin sicher, dass es eine einfache gleichwertige Perl-Lösung gibt.

2 Pythons calendarModul verwendet den proleptischen Gregorianischen Kalender , dh es erweitert den G.-Kalender auf unbestimmte Zeit in die Vergangenheit und Zukunft. Es wird nicht berücksichtigt, dass der G.-Kalender erst 1582 in Kraft getreten ist oder dass einige Gebietsschemata weiterhin andere Kalender mit anderen Schaltjahrregeln verwenden. Wenn Sie Unterstützung für andere Kalender benötigen, z. B. für den Julianischen Kalender, empfehle ich, ein geeignetes Python-Erweiterungsmodul zu installieren und zu verwenden.

David Foerster
quelle
Von calendar.py: def isleap(year): """Return True for leap years, False for non-leap years.""" return year % 4 == 0 and (year % 100 != 0 or year % 400 == 0). Gleiches fct. wie in askubuntu.com/a/1081237/790920 verwendet
abu_bua
@abu_bua: Ja, aber das Rad nicht neu zu erfinden bedeutet, dass Sie nicht die gleichen Fehler (sogar Tippfehler) wie der ursprüngliche Erfinder machen. Das setzt voraus, dass Sie der Arbeit dieses Erfinders vertrauen. Die Python-Kernmodule sind im Allgemeinen gut gewartet.
David Foerster