Как я проверяю, какие годы являются високосными годами?

Как я могу узнать, которые являются високосными годами между 2014 и 2020 в терминале Linux?

Есть ли любой способ использовать некоторый код как $cal - что-нибудь для показа, какие годы являются високосными годами между 2014 и 2020 немедленно?

19
задан 21 October 2018 в 12:18

4 ответа

Просто вариант ответа @ 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 устанавливает дату 29 февраля и печатает год, игнорируя любые ошибки.

9
ответ дан 23 November 2019 в 01:55

Можно использовать dateкод выхода для проверки в течение високосного года, полагаясь dateповедение генерации не 0 кодов выхода для недопустимой даты, obviosuly существует не 29-го февраля в невисокосный год:

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

как функция:

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

Использование:

$ isleap 2019
is not leap

$ isleap 2020
is leap

Относительно Вашего вопроса:

Как я могу узнать, которые являются високосными годами между 2014 и 2020 в терминале Linux?

echo "Leap years between 2014 and 2020:";
for y in {2014..2020}; do
    date -d $y-02-29 &>/dev/null && echo $y;
done
39
ответ дан 23 November 2019 в 01:55

Здесь на Переполнении стека, изящное решение было предоставлено anubhava:

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

Сохраните вышеупомянутое в названные текстовые файлы isleap.

Не забывайте устанавливать, выполняют разрешение:

chmod +x isleap

Протестируйте его:

$ ./isleap 1900
not a leap
$ ./isleap 2000
leap year
7
ответ дан 23 November 2019 в 01:55

Если Вы не хотите полагаться на некоторые несущественные “тайные” свойства високосных годов (как их делимость, количество дней через год или существование определенного дня), необходимо использовать язык программирования с соответствующей календарной библиотечной функцией. Я рекомендую Python 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

Использование:

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

Или как острота (без надлежащей обработки ошибок):

$ 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 я уверен, что существует простое эквивалентное решение для Perl.

2 Python calendar модуль использует преждевременный Григорианский календарь, т.е. он расширяет календарь G. неограниченно долго в прошлое и будущее. Это не принимает во внимание, что календарь G. только вступил в силу в 1582 или что некоторые локали продолжают использовать другие календари с различными правилами високосного года. Если Вы нуждаетесь в поддержке для других календарей, например, юлианского календаря, я рекомендую, чтобы Вы установили и использовали соответствующий модуль расширения Python.

3
ответ дан 23 November 2019 в 01:55

Другие вопросы по тегам:

Похожие вопросы: