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


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

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.


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

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.


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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.