¿Cómo verifico qué años son bisiestos?

19

¿Cómo puedo saber cuáles son los años bisiestos entre 2014 y 2020 en un terminal Linux?

¿Hay alguna forma de usar algún código como $cal, algo para mostrar qué años son bisiestos entre 2014 y 2020 de inmediato?

sotavento
fuente

Respuestas:

39

Puede usar dateel código de salida de 's para verificar un año bisiesto, confiando en dateel comportamiento de generar un código de salida que no sea 0 para una fecha no válida, obviamente no hay 29 de febrero en un año no bisiesto:

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

como una función:

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

Uso:

$ isleap 2019
is not leap

$ isleap 2020
is leap

Con respecto a tu pregunta:

¿Cómo puedo saber cuáles son los años bisiestos entre 2014 y 2020 en 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
fuente
por qué esto no funciona en la terminal de Mac
lee
Espero que no haya pedido una solución para mac en ask ubuntu ... Vea esto para el comando osx date .
pLumo
9

Solo una variante de la respuesta 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 establece la fecha al 29 de febrero e imprime el año, ignorando cualquier error que ocurra.

wjandrea
fuente
3
O inclusoseq -f "%g-02-29" 2014 2020 | date -f- +"%Y" 2>/dev/null
Trauma digital el
@ DigitalTrauma: ¡genial!
7

Aquí en Stack Overflow, anubhava proporcionó una solución elegante :

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

Guarde lo anterior en un archivo de texto llamado isleap.

No olvide configurar el permiso de ejecución:

chmod +x isleap

Pruébalo:

$ ./isleap 1900
not a leap
$ ./isleap 2000
leap year
abu_bua
fuente
Esta es la respuesta correcta. Los otros que dependen de una implementación arbitraria en el datecomando son hacks.
DocSalvager
3

Si no desea confiar en algunas propiedades "arcanas" incidentales de los años bisiestos (como su divisibilidad, la cantidad de días en un año o la existencia de un día específico), debe usar un lenguaje de programación con una biblioteca de calendario adecuada función. Recomiendo Python 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

Uso:

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

O como una línea (sin el manejo adecuado de errores):

$ 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 Estoy seguro de que hay una solución Perl equivalente simple.

2 El calendarmódulo de Python utiliza el calendario gregoriano proleptico , es decir, extiende el calendario G. indefinidamente al pasado y al futuro. No tiene en cuenta que el calendario G. solo entró en vigencia en 1582 o que algunos locales continúan usando otros calendarios con diferentes reglas de año bisiesto. Si necesita soporte para otros calendarios, por ejemplo, el calendario juliano, le recomiendo que instale y use un módulo de extensión Python apropiado.

David Foerster
fuente
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). Mismo fct. como se usa en askubuntu.com/a/1081237/790920
abu_bua
@abu_bua: Sí, pero no reinventar la rueda significa que no cometerá los mismos errores (incluso errores tipográficos) que su inventor original. Eso supone que confías en el trabajo de ese inventor. Los módulos principales de Python generalmente están bien mantenidos.
David Foerster