ฉันจะตรวจสอบปีอธิกสุรทินได้อย่างไร


19

ฉันจะทราบได้อย่างไรว่าปีใดที่ก้าวกระโดดระหว่างปี 2014 ถึงปี 2020 ใน terminal Linux?

มีวิธีใดบ้างที่ใช้โค้ดเช่น$cal- อะไรที่แสดงว่าปีใดที่ก้าวกระโดดปีระหว่างปี 2557 ถึงปี 2020?


คำตอบ:


39

คุณสามารถใช้dateรหัสออกเพื่อตรวจสอบปีอธิกสุรทินโดยอาศัยdateพฤติกรรมของการสร้างรหัสออกที่ไม่ใช่ 0 สำหรับวันที่ที่ไม่ถูกต้องซึ่งไม่มีวันที่ 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 ใน 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

เหตุใดจึงไม่ทำงานในขั้ว mac
le

ฉันหวังว่าคุณจะไม่ขอวิธีแก้ปัญหาสำหรับ mac บน ask ubuntu ... ดูคำสั่ง osx dateนี้
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
ดิจิตอลบาดเจ็บ

@ 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

หากคุณไม่ต้องการที่จะพึ่งพาคุณสมบัติ "ความลับ" บางอย่างของปีอธิกสุรทิน (เช่นการหารจำนวนวันในหนึ่งปีหรือการมีอยู่ของวันที่เฉพาะเจาะจง) คุณควรใช้ภาษาโปรแกรมที่มีไลบรารีปฏิทินที่เหมาะสม ฟังก์ชัน ฉันแนะนำ 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

การใช้งาน:

$ 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โมดูลของไพ ธ อนใช้ปฏิทินเกรกอเรียนที่มีความอุดมสมบูรณ์เช่นมันจะขยายปฏิทินจีไปเรื่อย ๆ ในอดีตและอนาคต ไม่คำนึงว่าปฏิทิน G. มีผลบังคับใช้ในปี 1582 เท่านั้นหรือบางแห่งยังคงใช้ปฏิทินอื่นที่มีกฎปีอธิกสุรทินต่างกัน หากคุณต้องการการสนับสนุนสำหรับปฏิทินอื่น ๆ เช่นปฏิทิน Julian ฉันขอแนะนำให้คุณติดตั้งและใช้โมดูลส่วนขยาย Python ที่เหมาะสม


จาก 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)calendar.py: fct เดียวกัน ตามที่ใช้ในaskubuntu.com/a/1081237/790920
abu_bua

@abu_bua: ใช่ แต่เพื่อไม่ประดิษฐ์ใหม่ล้อหมายความว่าคุณจะไม่ทำผิดพลาดเหมือนกัน (แม้พิมพ์ผิด) เป็นนักประดิษฐ์เดิม นั่นคือสมมติว่าคุณเชื่อถือในงานของนักประดิษฐ์นั้น โมดูลหลักของ Python นั้นได้รับการดูแลรักษาเป็นอย่างดี
David Foerster
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.