どの年がうるう年かを確認するにはどうすればよいですか?


回答:


39

無効な日付に対して0以外の終了コードを生成するという振る舞いにdate依存して、うるう年をチェックするためにの終了コードを使用できますdate

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

Macターミナルでこれが機能しない理由
リー

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
デジタル外傷

@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

うるう年の付随的な「不可解な」特性(その可分性、1年の日数、特定の日の存在など)に依存したくない場合は、適切なカレンダーライブラリでプログラミング言語を使用する必要があります。関数。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ソリューションがあると確信しています。

2 Pythonのcalendarモジュールは、予言的なグレゴリオ暦を使用します。つまり、G。カレンダーを無期限に過去と未来に拡張します。G.カレンダーが1582年にのみ有効になったことや、一部のロケールが異なるうるう年規則を持つ他のカレンダーを引き続き使用することを考慮していません。他のカレンダー、たとえばユリウス暦のサポートが必要な場合は、適切な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:はい、しかし、車輪を再発明しないということは、元の発明者と同じ間違い(タイプミスさえ)をしないことを意味します。それは、あなたがその発明者の仕事を信頼していることを前提としています。Pythonコアモジュールは一般的に適切に管理されています。
デビッドフォースター
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.