Comment vérifier quelles années sont des années bissextiles?

19

Comment savoir quelles sont les années bissextiles entre 2014 et 2020 dans un terminal Linux?

Existe-t-il un moyen d'utiliser un code comme $cal- quelque chose pour montrer immédiatement quelles années sont des années bissextiles entre 2014 et 2020?

Lee
la source

Réponses:

39

Vous pouvez utiliser datele code de sortie de 'pour vérifier une année bissextile, en vous basant sur datele comportement de' générer un code de sortie non 0 pour une date non valide, évidemment il n'y a pas de 29 février dans une année non bissextile:

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

en tant que fonction:

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

Usage:

$ isleap 2019
is not leap

$ isleap 2020
is leap

Concernant votre question:

Comment savoir quelles sont les années bissextiles entre 2014 et 2020 dans un terminal Linux?

echo "Leap years between 2014 and 2020:";
for y in {2014..2020}; do
    date -d $y-02-29 &>/dev/null && echo $y;
done
pLumo
la source
pourquoi cela ne fonctionne pas dans le terminal mac
lee
J'espère que vous n'avez pas demandé de solution pour mac sur ask ubuntu ... Voir ceci pour la commande osx date .
pLumo
9

Juste une variante de la réponse de @ 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 définit la date au 29 février et imprime l'année, en ignorant les erreurs qui se produisent.

wjandrea
la source
3
Ou mêmeseq -f "%g-02-29" 2014 2020 | date -f- +"%Y" 2>/dev/null
Digital Trauma
@DigitalTrauma: très cool!
7

Ici sur Stack Overflow, une solution élégante a été fournie par anubhava :

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

Enregistrez ce qui précède dans un fichier texte nommé isleap.

N'oubliez pas de définir l'autorisation d'exécution:

chmod +x isleap

Essaye-le:

$ ./isleap 1900
not a leap
$ ./isleap 2000
leap year
abu_bua
la source
Ceci est la bonne réponse. Les autres qui dépendent d'une implémentation arbitraire dans la datecommande sont des hacks.
DocSalvager
3

Si vous ne voulez pas vous fier à certaines propriétés «obscures» accessoires des années bissextiles (comme leur divisibilité, le nombre de jours dans une année ou l'existence d'un jour spécifique), vous devez utiliser un langage de programmation avec une bibliothèque de calendriers appropriée. une fonction. Je recommande 1, 2 de Python :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

Usage:

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

Ou en une ligne (sans traitement d'erreur approprié):

$ 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 Je suis sûr qu'il existe une solution Perl équivalente simple.

2 Le calendarmodule de Python utilise le calendrier grégorien proleptique , c'est-à-dire qu'il étend indéfiniment le calendrier G. dans le passé et le futur. Il ne tient pas compte du fait que le calendrier G. n'est entré en vigueur qu'en 1582 ou que certains paramètres régionaux continuent d'utiliser d'autres calendriers avec des règles d'année bissextile différentes. Si vous avez besoin de support pour d'autres calendriers, par exemple le calendrier Julian, je vous recommande d'installer et d'utiliser un module d'extension Python approprié.

David Foerster
la source
De 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). Même fct. tel qu'utilisé dans askubuntu.com/a/1081237/790920
abu_bua
@abu_bua: Oui, mais ne pas réinventer la roue signifie que vous ne ferez pas les mêmes erreurs (même des fautes de frappe) que son inventeur d'origine. Cela suppose que vous faites confiance au travail de cet inventeur. Les modules principaux de Python sont généralement bien entretenus.
David Foerster