Làm thế nào để tôi kiểm tra năm nào là năm nhuận?


19

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?

Có cách nào sử dụng một số mã như $cal- bất cứ điều gì để chỉ ra năm nào là năm nhuận giữa năm 2014 và 2020 không?


Câu trả lời:


39

Bạn có thể sử dụng datemã thoát để kiểm tra năm nhuận, dựa vào datehà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

tại sao điều này không hoạt động trong thiết bị đầu cuối mac
lee

Tôi hy vọng bạn đã không yêu cầu một giải pháp cho mac khi hỏi ubfox ... Xem phần này cho lệnh ngày osx .
pLumo

9

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.


3
Hoặc thậm chíseq -f "%g-02-29" 2014 2020 | date -f- +"%Y" 2>/dev/null
Chấn thương kỹ thuật số

@DigitalTrauma: rất tuyệt!

7

Ở đâ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

Đây là câu trả lời chính xác. Những cái khác phụ thuộc vào việc thực hiện tùy ý trong datelệnh là hack.
DocSalvager

3

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.


Từ 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). Cùng fct. như được sử dụng trong Askubfox.com/a/1081237/790920
abu_bua

@abu_bua: Có, nhưng để không phát minh lại bánh xe có nghĩa là bạn sẽ không mắc phải những lỗi tương tự (thậm chí lỗi chính tả) như nhà phát minh ban đầu của nó. Đó là giả định rằng bạn tin tưởng vào công việc của nhà phát minh đó. Các mô-đun lõi Python thường được duy trì tốt.
David Foerster
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.