शेल में दिनांक सत्यापन


14

मैं शेल स्क्रिप्ट में नीचे दिनांक स्वरूप को मान्य करना चाहता हूं

2015-Jul-13

मैं उपयोग कर रहा हूँ, date -d "2015-Jul-13" +"%Y-%b-%d"लेकिन इसकी त्रुटि दे रहा हूँ

date: invalid date '2015-Jul-13'

@ पंड्या: ओपी अपने सवाल के बारे में स्पष्ट है। ओपी उल्लिखित तिथि प्रारूप को सत्यापित करना चाहता है (दर्ज तिथि मान्य है या नहीं) लेकिन यह कह रहा है कि दर्ज की गई तिथि अमान्य है।
तुषी

GNU dateपहचान नहीं करता है YYYY-MMM-DD। आप YYYY-MM-DDया DD MMM YYYYइसके बजाय उपयोग कर सकते हैं ?
रोइमा

मुझे पूरा यकीन atहै कि , और मुझे लगता है कि - भी touchकरता है। मैंने एक touchबार के आधार पर डेट वैल्यूएशन शेल फंटावेशन लिखा था ... नहीं, नहीं touch- यह केवल अंकों को संभालता है, लेकिन atकुछ बहुत गहरी पार्सिंग करता है ...
mikeserv

@ तुशी चलो हमारे द्वारा स्पष्ट निरर्थक टिप्पणी
पंड्या

6
शीर्षक गलत: दिनांक सत्यापन नरक है
एडम डेविस

जवाबों:


12

GNU dateसमर्थन नहीं करता है YYYY-MMM-DD। हालाँकि, यह समझ में आता है DD-MMM-YYYY। इसलिए यदि आपको वास्तव में इस प्रारूप की तारीखों को संभालना है, तो आप इसे कुछ इस तरह से कर सकते हैं, जो बस एक प्रारूप के लिए तर्कों को स्वैप करता है जो dateउम्मीद करता है:

ymd='2015-Jul-13'

dmy=$(echo "$ymd" | awk -F- '{ OFS=FS; print $3,$2,$1 }')
if date --date "$dmy" >/dev/null 2>&1
then
    echo OK
fi

यहाँ एक सभी शेल समाधान है। इसे तोड़कर, IFS=-निर्देश शेल को व्हॉट्सएप के -बजाय हाइफन द्वारा आगामी कमांड लाइन को विभाजित करने के लिए कहता है । set $ymdपार्स करता है $ymdएक कमांड लाइन के लिए के रूप में चर, लेकिन अब, हाइफन से विभाजन मापदंडों के मान निर्दिष्ट $1, $2 एट सेकecho "$3-$2-$1"तुच्छता से उलट क्रम में तीन पर कब्जा कर लिया मूल्यों आउटपुट।

ymd='2015-Jul-13'

dmy=$(IFS=-; set $ymd; echo "$3-$2-$1")
if date --date "$dmy" >/dev/null 2>&1
then
    echo OK
fi

@mikeserv: शीतलता! इसके साथ काम किया: ymd=$(IFS=-;set $ymd; echo "$3-$2-$1") क्या आप शायद setआदेश के पीछे के जादू को प्रकट कर सकते हैं ?
ज्यूपड

11

मैनपेज से: -

DATE STRING
       The --date=STRING is a mostly free format human readable date string such as "Sun, 29 Feb 2004 16:21:42 -0800"
       or  "2004-02-29  16:21:42" or even "next Thursday".  A date string may contain items indicating calendar date,
       time of day, time zone, day of week, relative time, relative date, and numbers.  An empty string indicates the
       beginning  of  the  day.   The  date string format is more complex than is easily documented here but is fully
       described in the info documentation.

लेकिन ऐसा लगता है कि यह YYYY-MMM-DDप्रारूप नहीं है । तो, आप या तो नीचे से या इसी तरह का उपयोग कर सकते हैं:

$ date -d "2015-07-13" +"%Y-%b-%d"
2015-Jul-13
$ date -d "Jul 13 2015" +"%Y-%b-%d"
2015-Jul-13
$ date -d "13 Jul 2015" +"%Y-%b-%d"
2015-Jul-13

या आपको इसे भेजने से पहले इसे बदलना / फिर से तैयार करना है date!

यह भी देखें कि आप तिथि के लिए इनपुट के लिए एक प्रारूप कैसे निर्दिष्ट करते हैं?


मैं यात्रा करने की सलाह देता हूं: तिथि इनपुट प्रारूप

यहाँ नियम हैं।

संख्यात्मक महीनों के लिए , आईएसओ 8601 प्रारूप 'वर्ष-महीने-दिन' की अनुमति है, जहां वर्ष कोई भी सकारात्मक संख्या है, माह 01 और 12 के बीच की संख्या है, और दिन 01 और 31 के बीच की संख्या है। एक अग्रणी शून्य मौजूद होना चाहिए यदि कोई संख्या दस से कम है। यदि वर्ष 68 या उससे कम है, तो इसमें 2000 जोड़ा जाता है; अन्यथा, यदि वर्ष 100 से कम है, तो इसमें 1900 जोड़ा जाता है। संयुक्त राज्य अमेरिका में लोकप्रिय 'महीना / दिन / वर्ष' का निर्माण स्वीकार किया जाता है। साथ ही 'महीना / दिन', वर्ष को छोड़कर।

शाब्दिक महीनों को पूरी तरह से समझा जा सकता है: 'जनवरी', 'फरवरी', 'मार्च', 'अप्रैल', 'मे', 'जून', 'जुलाई', 'अगस्त', 'अगस्त', 'सितंबर', 'अक्टूबर', ' नवंबर 'या' दिसंबर '। शाब्दिक महीनों को उनके पहले तीन अक्षरों के लिए संक्षिप्त किया जा सकता है, संभवतः एक संक्षिप्त बिंदु के बाद। इसे 'सितंबर' के बजाय 'सेप्ट' लिखने की भी अनुमति है।

जब महीनों को शाब्दिक रूप से लिखा जाता है , तो कैलेंडर की तारीख निम्नलिखित में से किसी के रूप में दी जा सकती है:

 दिन महीना साल
 दिन महीना
 महीना दिन साल साल
 -महीना साल

मेरे द्वारा जोर दिया गया

यहां आप देख सकते हैं कि साल-महीने-दिन जैसा कोई प्रारूप नहीं है ! (महीनों के लिए शाब्दिक रूप से लिखे गए हैं)


7

साथ zshआप इस्तेमाल कर सकते हैं strftimeनिर्मित (के माध्यम से उपलब्ध zsh/datetimeके साथ) -r(रिवर्स):

strftime -r format timestring

जो प्रारूप का उपयोग समयरेखा को पार्स करने और सेकंड के बाद से सेकंड की संख्या को आउटपुट करने के लिए करता है :

zmodload zsh/datetime
strftime -r %Y-%b-%d 2015-Jul-13
1436734800

यदि दिनांक अमान्य है, तो यह त्रुटियां:

strftime -r %Y-%b-%d 2015-Jul-33
zsh: strftime: 5: प्रारूप का मिलान नहीं हुआ

आप सेकंड से किसी भी अन्य मानक / कस्टम तिथि प्रारूप जैसे युग में परिवर्तित कर सकते हैं

strftime '%A, %B %d, %Y' 1447970400
20 नवंबर 2015 को शुक्रवार है
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.