如何在 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 扩展模块。