Câu trả lời:
Bạn có thể sử dụng date
mã thoát để kiểm tra năm nhuận, dựa vào date
hành vi tạo mã thoát không 0 cho một ngày không hợp lệ, đáng chú ý là không có ngày 29 tháng 2 trong một năm không nhảy vọt:
date -d $year-02-29 &>/dev/null
echo $?
như một chức năng:
isleap() { date -d $1-02-29 &>/dev/null && echo is leap || echo is not leap; }
Sử dụng:
$ isleap 2019
is not leap
$ isleap 2020
is leap
Liên quan đến câu hỏi của bạn:
Làm cách nào tôi có thể tìm ra những năm nhuận từ 2014 đến 2020 trong một thiết bị đầu cuối Linux?
echo "Leap years between 2014 and 2020:";
for y in {2014..2020}; do
date -d $y-02-29 &>/dev/null && echo $y;
done
Chỉ là một biến thể của câu trả lời của @ 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
đặt ngày 29 tháng 2 và in năm, bỏ qua mọi lỗi xảy ra.
seq -f "%g-02-29" 2014 2020 | date -f- +"%Y" 2>/dev/null
Ở đây trên Stack Overflow, một giải pháp tao nhã đã được cung cấp bởi anubhava :
#!/bin/bash (( !($1 % 4) && ( $1 % 100 || !( $1 % 400) ) )) && echo "leap year" || echo "not a leap" exit 0
Lưu ở trên trong một tập tin văn bản có tên isleap
.
Đừng quên thiết lập quyền thực thi:
chmod +x isleap
Kiểm tra nó:
$ ./isleap 1900
not a leap
$ ./isleap 2000
leap year
date
lệnh là hack.
Nếu bạn không muốn dựa vào một số thuộc tính ngẫu nhiên của Arc arcane của năm nhuận (như tính chia hết của chúng, số ngày trong một năm hoặc sự tồn tại của một ngày cụ thể), bạn nên sử dụng ngôn ngữ lập trình với thư viện lịch thích hợp chức năng. Tôi khuyên dùng 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
Sử dụng:
$ python3 is_leap.py 2000
True
$ python3 is_leap.py 2100
False
Hoặc dưới dạng một lớp lót (không có xử lý lỗi thích hợp):
$ 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 Tôi chắc chắn có một giải pháp Perl tương đương đơn giản.
2calendar
Mô-đun của Python sử dụng lịch Gregorian nguyên sinh , tức là nó kéo dài lịch G. vô thời hạn vào quá khứ và tương lai. Điều đó không tính đến việc lịch G. chỉ có hiệu lực vào năm 1582 hoặc một số địa phương tiếp tục sử dụng các lịch khác với các quy tắc năm nhuận khác nhau. Nếu bạn cần hỗ trợ cho các lịch khác, ví dụ lịch Julian, tôi khuyên bạn nên cài đặt và sử dụng mô-đun mở rộng Python thích hợp.
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)
. Cùng fct. như được sử dụng trong Askubfox.com/a/1081237/790920