Як я можу перевірити, які роки є високосними?


19

Як я можу дізнатися, які високосні роки між 2014 та 2020 роками в терміналі Linux?

Чи є якийсь спосіб використовувати якийсь код на зразок $cal- що-небудь показати, які роки є високосними з 2014 по 2020 рік?


Відповіді:


39

Ви можете скористатися dateкодом виходу 's для перевірки високосного року, покладаючись на dateповедінку генерування коду виходу без 0 для недійсної дати;

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

чому це не працює в mac-терміналі
лій

Я сподіваюся, що ви не просили рішення для Mac на запит ubuntu ... Дивіться це для команди date date osx .
pLumo

9

Просто варіант відповіді @ 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 лютого та друкує рік, ігноруючи будь-які помилки.


3
Або навітьseq -f "%g-02-29" 2014 2020 | date -f- +"%Y" 2>/dev/null
Digital Trauma

@DigitalTrauma: дуже круто!

7

Тут, на Stack Overflow, елегантне рішення було запропоновано 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

Це правильна відповідь. Інші, які залежать від довільної реалізації dateкоманди, - це хаки.
DocSalvager

3

Якщо ви не хочете покладатися на якісь випадкові "таємні" властивості високосних років (наприклад, їх поділ, кількість днів у році чи існування певного дня), ви повинні використовувати мову програмування з відповідною бібліотекою календаря функція. Я рекомендую 1, 2 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

Використання:

$ 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.

2calendar Модуль Python використовує пролептичний григоріанський календар , тобто він нескінченно поширює календар G. на минуле та майбутнє. При цьому не враховується, що календар G. набув чинності лише у 1582 р. Або що деякі місцевості продовжують використовувати інші календарі з різними правилами високосного року. Якщо вам потрібна підтримка інших календарів, наприклад, календаря Джуліана, рекомендую встановити та використовувати відповідний модуль розширення Python.


З календаря.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). То ж фкт. як використовується в askubuntu.com/a/1081237/790920
abu_bua

@abu_bua: Так, але не винаходити колесо означає, що ви не помилитесь (навіть помилки), як і його оригінальний винахідник. Це припускаючи, що ви довіряєте роботі цього винахідника. Основні модулі Python, як правило, добре підтримуються.
Девід Фоерстер
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.