윤년이 몇 년인지 어떻게 확인합니까?


답변:


39

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

왜 이것이 맥 터미널에서 작동하지 않는가
lee

ask ubuntu 에서 mac 용 솔루션을 요청하지 않았기를 바랍니다 . 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 날짜를 2 월 29 일로 설정하고 발생하는 모든 오류를 무시하고 연도를 인쇄합니다.


3
또는 심지어seq -f "%g-02-29" 2014 2020 | date -f- +"%Y" 2>/dev/null
Digital Trauma

@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

윤년의 일부 우연한 "arcane"속성 (분 산성, 1 년의 일수 또는 특정 날짜의 존재와 같은)에 의존하지 않으려면 적절한 달력 라이브러리가있는 프로그래밍 언어를 사용해야합니다 함수. 나는 파이썬의 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 솔루션이 있다고 확신합니다.

2 파이썬 calendar모듈은 다발성 그레고리력을 사용합니다 . 즉, G. 달력을 과거와 미래로 무한정 확장합니다. G. 달력은 1582 년에만 적용되었거나 일부 로케일은 다른 윤년 규칙을 가진 다른 달력을 계속 사용한다는 점을 고려하지 않습니다. Julian 캘린더와 같은 다른 캘린더를 지원해야하는 경우 적절한 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). 같은 fct. askubuntu.com/a/1081237/790920
abu_bua

@abu_bua : 그렇습니다. 그러나 바퀴를 재발 명하지 않는다는 것은 원래 발명자와 같은 실수 (오타조차)를 만들지 않음을 의미합니다. 그것은 당신이 그 발명가의 작업을 신뢰한다고 가정합니다. 파이썬 핵심 모듈은 일반적으로 잘 관리됩니다.
David Foerster
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.