शेल स्क्रिप्ट में YYYY-MM-DD प्रारूप तिथि


1107

मैंने $(date)अपने बैश शेल स्क्रिप्ट में उपयोग करने की कोशिश की , हालांकि, मुझे YYYY-MM-DDप्रारूप में तारीख चाहिए ।
ये मुझे कैसे मिलेगा?

जवाबों:


1826

बैश में (> = 4.2) प्रिंटफ की अंतर्निहित तिथि फ़ॉर्मेटर (बैश का हिस्सा) को बाहरी date(आमतौर पर जीएनयू तिथि) के बजाय उपयोग करना बेहतर होता है ।

जैसे की:

# put current date as yyyy-mm-dd in $date
# -1 -> explicit current date, bash >=4.3 defaults to current time if not provided
# -2 -> start time for shell
printf -v date '%(%Y-%m-%d)T\n' -1 

# put current date as yyyy-mm-dd HH:MM:SS in $date
printf -v date '%(%Y-%m-%d %H:%M:%S)T\n' -1 

# to print directly remove -v flag, as such:
printf '%(%Y-%m-%d)T\n' -1
# -> current date printed to terminal

बैश में (<4.2):

# put current date as yyyy-mm-dd in $date
date=$(date '+%Y-%m-%d')

# put current date as yyyy-mm-dd HH:MM:SS in $date
date=$(date '+%Y-%m-%d %H:%M:%S')

# print current date directly
echo $(date '+%Y-%m-%d')

अन्य उपलब्ध दिनांक स्वरूपों को दिनांक मैन पेज (बाहरी गैर-बैश विशिष्ट आदेश के लिए) से देखा जा सकता है :

man date

4
महीने के पहले दिनों में मुझे "2012-07-1" मिलता है, जो वह नहीं है जो ओपी पूछता है।
डेरेमी

6
यह मेरे लिए काम करता है। मैन पेज बताता है कि महीने का पहला 01 है, नं 1 (Ex। 2012-07-01)।
बॉब कुहर

30
DATE = $ (दिनांक +% d-% m-% Y ""% H:% M:% S); आखिर मैंने क्या किया।
जैकोपेन

5
मैंने जांच नहीं की है कि ये शॉर्टकट कितने व्यापक रूप से उपलब्ध हैं, लेकिन कुछ वितरणों में आप +%F %Tशॉर्टकट के रूप में उपयोग कर सकते हैं +%Y-%m-%d %H:%M:%S। बस ध्यान दें कि कुछ फाइलसिस्टम (खांसी ** एचएफएस) :एक में परिवर्तित हो जाएंगे /, जिससे आपको एक स्ट्रिंग मिलेगी, 2016-09-15 11/05/00जो शक्तिशाली भ्रमित है।
रिपोर्टर

24
इस सहस्राब्दी में किसी भी POSIX- आज्ञाकारी खोल में पसंदीदा वाक्यविन्यास date=$(date)है date=`date`। इसके अलावा, अपने निजी चर के लिए अपरकेस का उपयोग न करें; अपरकेस चर नाम सिस्टम के लिए आरक्षित हैं।
ट्रिपलए

335

प्रयत्न: $(date +%F)


12
दिनांक के लिए वह आदमी पृष्ठ पढ़ता है:% F पूर्ण तिथि; % Y-% m-% d के रूप में समान है, इसलिए यह स्वीकृत उत्तर के लिए सिर्फ एक अधिक कॉम्पैक्ट अंकन है।
होवार्ड गेयथस


47

आप आईएसओ 8601 मानक तिथि प्रारूप की तलाश कर रहे हैं , इसलिए यदि आपके पास जीएनयू तिथि है (या 1988 से अधिक आधुनिक कोई आदेश है):$(date -I)


9
मेरे पास हाल ही में (> 1988) मैक ओएस एक्स कंप्यूटर है, और date -Iकाम नहीं किया। काढ़ा (जो उपसर्ग 'जी' का उपयोग करता है) का उपयोग करके GNU कोरुटिल स्थापित करने के बाद काम किया। gdate -I
जोएल पुर्रा

3
अजीब। मुझे -IGNU के लिए प्रलेखित विकल्प नहीं मिल रहा है date, हालाँकि यकीन है कि यह इसके बराबर प्रतीत होता है date +%F
शेपनर

3
ओएस एक्स आमतौर पर एक जीपीएल v3 बंजर भूमि है, इसलिए हो सकता है कि उन्होंने हाल ही में अपडेट की गई तारीख या BASH न हो।
Indolering

20
date -d '1 hour ago' '+%Y-%m-%d'

आउटपुट होगा 2015-06-14


3
दो कारणों से गलत, जाहिर है कि यह 00:00 और 01:00 के बीच गलत तारीख देता है, और इसके अलावा आप एक के साथ समाप्त होते हैं %
गेरहार्ड बर्गर

यह सच नहीं है। इस विरल एकल उद्धरण की तरह होना चाहिए
बेहान गुलेल

20
$(date +%F_%H-%M-%S)

कोलन हटाने के लिए इस्तेमाल किया जा सकता है (:) बीच में

उत्पादन

2018-06-20_09-55-58

19

हाल के बैश (संस्करण) 4.2) के साथ, आप बिल्ट printfइन फॉर्मेट संशोधक का उपयोग कर सकते हैं %(strftime_format)T:

$ printf '%(%Y-%m-%d)T\n' -1  # Get YYYY-MM-DD (-1 stands for "current time")
2017-11-10
$ printf '%(%F)T\n' -1  # Synonym of the above
2017-11-10
$ printf -v date '%(%F)T' -1  # Capture as var $date

printfबाहरी कमांड होने dateके बावजूद यह बैश बिलिन से बहुत तेज है date

के रूप में अच्छी तरह से, printf -v date ...की तुलना date=$(printf ...)में यह एक उपधारा फोर्किंग की आवश्यकता नहीं है की तुलना में तेजी है ।


4
2019 में एक नोट के रूप में, यह कमांड अविश्वसनीय रूप से तेज है * dateयदि आप इसका उपयोग पहले से ही एक बैश स्क्रिप्ट के भीतर से कर रहे हैं, क्योंकि इसमें कोई अतिरिक्त लाइब्रेरी लोड नहीं करनी है। (* मैंने अपने लिनक्स सर्वर पर 1000 पुनरावृत्तियों पर एक ~ 160x की गति का अंतर मापा)
timtj

@timtj कि बाहर इशारा करने के लिए धन्यवाद! मैंने जवाब में गति के बारे में कुछ नोट्स जोड़े।
वेजेंड्रिया

1
मेरी इच्छा है कि मैं टिप्पणी के लिए +5 को printf -v dateसब्सक्राइब न करूं। बहुत अच्छी जानकारी !!
टाइम्टज

आमतौर पर मैं तारीख का उपयोग करता हूं क्योंकि मुझे कुछ तारीखों के माध्यम से वेतन वृद्धि की आवश्यकता है। क्या प्रिंटफ़ तारीख अंकगणित कर सकता है?
मर्लिन

1
@ मर्लिन मुझे ऐसा नहीं लगता
wjandrea 22

8

जब भी मेरे पास इस तरह का कोई कार्य होता है, तो मैं अंत में वापस आ जाता हूं

$ man strftime

सभी संभावनाओं को याद दिलाने के लिए।


7

यदि आप वर्ष को 2017 के बजाय दो संख्या प्रारूप में वर्ष 17 के रूप में चाहते हैं, तो निम्न कार्य करें:

DATE=`date +%d-%m-%y`

6
#!/bin/bash -e

x='2018-01-18 10:00:00'
a=$(date -d "$x")
b=$(date -d "$a 10 min" "+%Y-%m-%d %H:%M:%S")
c=$(date -d "$b 10 min" "+%Y-%m-%d %H:%M:%S")
#date -d "$a 30 min" "+%Y-%m-%d %H:%M:%S"

echo Entered Date is $x
echo Second Date is $b
echo Third Date is $c

यहां x नमूना तिथि का उपयोग किया गया है और फिर उदाहरण डेटा के दोनों स्वरूपण को प्रदर्शित करता है और साथ ही दिनांक 10 मिनट अधिक वर्तमान तिथि प्राप्त कर रहा है।


5

मैं का उपयोग करें $(date +"%Y-%m-%d") या $(date +"%Y-%m-%d %T")समय और घंटे के साथ।


5

मैं निम्नलिखित सूत्रीकरण का उपयोग करता हूं:

TODAY=`date -I`
echo $TODAY

इसके लिए मैन पेज चेकआउट करें date, कई अन्य उपयोगी विकल्प हैं:

man date

1

आप पर्यावरण चर के रूप में तिथि निर्धारित कर सकते हैं और बाद में यू इसका उपयोग कर सकते हैं

setenv DATE `date "+%Y-%m-%d"`
echo "----------- ${DATE} -------------"

या

DATE =`date "+%Y-%m-%d"`
echo "----------- ${DATE} -------------"
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.