我如何检查哪些年份是闰年?

我如何检查哪些年份是闰年?

如何在 Linux 终端中找出 2014 年至 2020 年之间的闰年?

有没有办法使用一些代码来$cal立即显示 2014 年和 2020 年之间的哪些年份是闰年?

答案1

您可以使用 的date退出代码来检查是否为闰年,依靠 为date无效日期生成非 0 退出代码的行为,显然非闰年没有 2 月 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

关于你的问题:

如何在 Linux 终端中找出 2014 年至 2020 年之间的闰年?

echo "Leap years between 2014 and 2020:";
for y in {2014..2020}; do
    date -d $y-02-29 &>/dev/null && echo $y;
done

答案2

只是@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将日期设置为 2 月 29 日并打印年份,忽略发生的任何错误。

答案3

在 Stack Overflow 上,提供了一个优雅的解决方案阿努巴瓦

#!/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

答案4

如果你不想依赖闰年的一些偶然的“神秘”属性(比如它们的可分性、一年中的天数或特定日期的存在),你应该使用具有适当日历库函数的编程语言。我推荐 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 扩展模块。

相关内容