Hangi yılların artık yıl olduğunu nasıl kontrol edebilirim?


Yanıtlar:


39

Artık datebir yılı kontrol etmek için date'çıkış kodunu, geçersiz bir tarih için 0 olmayan bir çıkış kodu oluşturma davranışına dayanarak kullanabilirsiniz;

date -d $year-02-29 &>/dev/null
echo $?

işlev olarak:

isleap() { date -d $1-02-29 &>/dev/null && echo is leap || echo is not leap; }

Kullanımı:

$ isleap 2019
is not leap

$ isleap 2020
is leap

Sorunuzla ilgili olarak:

Bir Linux terminalinde 2014 ve 2020 yılları arasında hangisinin yıllar olduğunu nasıl öğrenebilirim?

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

neden bu mac terminalinde çalışmıyor
lee

Umarım ask ubuntu'da mac için bir çözüm istemediniz ... Osx tarih komutu için buna bakın .
pLumo

9

@ RoVo'nun cevabının sadece bir çeşidi ...

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 tarihi 29 Şubat'a ayarlar ve ortaya çıkan hataları yoksayarak yılı yazdırır.


3
Hatta çiftseq -f "%g-02-29" 2014 2020 | date -f- +"%Y" 2>/dev/null
Dijital Travma

@DigitalTrauma: çok havalı!

7

Burada Stack Overflow'da anubhava tarafından zarif bir çözüm sağlandı :

#!/bin/bash
(( !($1 % 4) && ( $1 % 100 || !( $1 % 400) ) )) &&
echo "leap year" || echo "not a leap"
exit 0

Yukarıdakileri adlı bir metin dosyasına kaydedin isleap.

Yürütme izni ayarlamayı unutmayın:

chmod +x isleap

Dene:

$ ./isleap 1900
not a leap
$ ./isleap 2000
leap year

Bu doğru cevap. Komutta keyfi bir uygulamaya bağlı olan diğerleri datehack'tir.
DocSalvager

3

Artık yılların bazı arızi “gizli” özelliklerine güvenmek istemiyorsanız (bölünebilirlikleri, bir yıldaki gün sayısı veya belirli bir günün varlığı gibi) uygun bir takvim kitaplığına sahip bir programlama dili kullanmalısınız işlevi. Python'un 1, 2'sini öneririm :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

Kullanımı:

$ python3 is_leap.py 2000
True
$ python3 is_leap.py 2100
False

Veya tek astar olarak (uygun hata işleme olmadan):

$ 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 Eminim basit bir eşdeğer Perl çözümü vardır.

2 Python'un calendarmodülü proleptik Gregoryen takvimini kullanır , yani G. takvimini süresiz olarak geçmişe ve geleceğe doğru genişletir. G. takviminin sadece 1582'de yürürlüğe girdiği veya bazı yerlilerin farklı artık yıl kurallarına sahip diğer takvimleri kullanmaya devam ettikleri dikkate alınmaz. Julian takvimi gibi başka takvimler için desteğe ihtiyacınız varsa, uygun bir Python genişletme modülü kurmanızı ve kullanmanızı öneririz.


Calendar.py Gönderen: 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). Aynı fct. askubuntu.com/a/1081237/790920
abu_bua

@abu_bua: Evet, ancak tekerleği yeniden icat etmemek, orijinal mucidi ile aynı hataları (yazım hataları bile) yapmayacağınız anlamına gelir. Bu mucidin çalışmasına güvendiğinizi varsayıyor. Python çekirdek modülleri genellikle iyi korunur.
David Foerster
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.