如何检查check年是哪几年?


Answers:


39

您可以利用date的退出代码来检查a年,这取决于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年之间有哪些leap年?

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

为什么这在Mac终端中不起作用
Lee Lee

希望您不要在ask ubuntu上要求Mac的解决方案...有关osx date命令的信息,请参见。
pLumo '18 -10-17

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 将日期设置为2月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命令中任意实现的其他工具是hack。
DocSalvager '18年

3

如果您不想依靠leap年的一些附带“ arcane”属性(例如其可除性,一年中的天数或存在的特定日期),则应使用具有适当日历库的编程语言功能。我建议使用Python的1、2calendar.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解决方案。

2 Python的calendar模块使用多用公历,即它无限期地将G.日历扩展到过去和将来。它没有考虑到G.日历仅在1582年生效,或者某些语言​​环境继续使用具有不同leap年规则的其他日历。如果需要其他日历(例如朱利安日历)的支持,建议您安装并使用适当的Python扩展模块。


从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)。相同的功能。如askubuntu.com/a/1081237/790920中
abu_bua

@abu_bua:是的,但是不要重新发明轮子意味着您不会犯与其原始发明人相同的错误(甚至是错别字)。假设您信任该发明者的工作。Python核心模块通常维护良好。
大卫·佛斯特
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.