मैं कैसे जांचूं कि कौन से वर्ष लीप वर्ष हैं?


19

मैं कैसे पता लगा सकता हूं कि लिनक्स टर्मिनल में 2014 और 2020 के बीच लीप वर्ष हैं?

क्या कोई कोड का उपयोग करने का कोई तरीका है $cal- कुछ भी दिखाने के लिए जो 2014 और 2020 के बीच सीधे लीप वर्ष हैं?


जवाबों:


39

आप dateएक लीप वर्ष की जाँच के लिए 'एग्जिट कोड' का उपयोग कर सकते हैं , dateकिसी अमान्य दिनांक के लिए नॉन 0 एग्जिट कोड बनाने के व्यवहार पर भरोसा करते हुए , एक गैर-लीप वर्ष में फ़रवरी का कोई 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

आपके प्रश्न के बारे में:

मैं कैसे पता लगा सकता हूं कि लिनक्स टर्मिनल में 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

मुझे आशा है कि आपने ubuntu के पूछने पर मैक के लिए कोई समाधान नहीं पूछा था ... इसे ओएक्सएक्स डेट कमांड के लिए देखें ।
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 किसी भी त्रुटि को अनदेखा करते हुए, 29 फरवरी को तिथि निर्धारित करता है और वर्ष प्रिंट करता है।


3
या यहां तक ​​किseq -f "%g-02-29" 2014 2020 | date -f- +"%Y" 2>/dev/null
डिजिटल ट्रॉमा

@DigitalTrauma: बहुत अच्छा!

7

स्टैक ओवरफ्लो पर, शुभता द्वारा एक सुंदर समाधान प्रदान किया गया था :

#!/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 17

3

यदि आप लीप वर्ष के कुछ आकस्मिक "रहस्यमय" गुणों पर भरोसा नहीं करना चाहते हैं (जैसे कि उनकी विभाज्यता, वर्ष में दिनों की संख्या, या एक विशिष्ट दिन का अस्तित्व) तो आपको एक उपयुक्त कैलेंडर लाइब्रेरी के साथ प्रोग्रामिंग भाषा का उपयोग करना चाहिए समारोह। मैं पायथन के 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 मुझे यकीन है कि एक सरल समकक्ष पर्ल समाधान है।

2 पायथन के calendarमॉड्यूल प्रोलेप्टिक ग्रेगोरियन कैलेंडर का उपयोग करता है , अर्थात यह जी कैलेंडर को अतीत और भविष्य में अनिश्चित काल तक विस्तारित करता है। यह ध्यान में नहीं आता है कि जी कैलेंडर केवल 1582 में प्रभावी हुआ या कुछ स्थान अलग-अलग लीवर वर्ष के नियमों के साथ अन्य कैलेंडर का उपयोग करना जारी रखते हैं। यदि आपको अन्य कैलेंडर के लिए समर्थन की आवश्यकता है, उदाहरण के लिए जूलियन कैलेंडर, तो मैं आपको उपयुक्त पायथन एक्सटेंशन मॉड्यूल को स्थापित करने और उपयोग करने की सलाह देता हूं।


कैलेंडरहोम से 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: हाँ, लेकिन पहिया को फिर से नहीं करने का मतलब है कि आप इसके मूल आविष्कारक के रूप में एक ही गलती (यहां तक ​​कि टाइपोस) नहीं करेंगे। यह मानते हुए कि आप उस आविष्कारक के काम में भरोसा करते हैं। पायथन कोर मॉड्यूल आमतौर पर अच्छी तरह से बनाए रखा जाता है।
डेविड फ़ॉस्टर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.