web-dev-qa-db-fra.com

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

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

Existe-t-il un moyen d'utiliser un code tel que $cal - quelque chose qui indique d'emblée les années bissextiles entre 2014 et 2020?

19
lee

Vous pouvez utiliser le code de sortie de date pour vérifier une année bissextile, en vous fiant au comportement de date de générer un code de sortie autre que 0 pour une date non valide.

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

En ce qui concerne votre question:

Comment puis-je 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
40
pLumo

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 affiche l'année en ignorant les erreurs éventuelles.

9
JJoao

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é isleapname__.

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
7
abu_bua

Si vous ne voulez pas vous fier à certaines propriétés "mystérieuses" accidentelles des années bissextiles (telles que 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 Python’s calendar.isleap()1, 2:

#!/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 correct des erreurs):

$ 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 simple et équivalente à Perl.

2 Le module calendar de Python utilise le calendrier proleptique grégorien , i. e. il prolonge 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 différentes pour les années bissextiles. Si vous avez besoin d'assistance pour d'autres calendriers, e. g. calendrier Julian, je vous recommande d'installer et d'utiliser un module d'extension approprié Python.

3
David Foerster