जवाबों:
आप वर्तमान यूनिक्स टाइमस्टैम्प को प्राप्त कर सकते हैं date "+%s", कुछ सरल गणित (मेरा उदाहरण है bash) के साथ वर्तमान तिमाही-घंटे का पता लगा सकते हैं और इसे बेहतर प्रारूप के साथ वापस प्रिंट कर सकते हैं date:
curdate=`date "+%s"`
curquarter=$(($curdate - ($curdate % (15 * 60))))
date -d"@$curquarter"
@अगर यह आपके ओएस पर काम करता है नहीं है एक टाइमस्टैम्प से आज की तारीख और समय निर्धारित करने की वाक्य रचना, आज तक एक जीएनयू विस्तार है, तो आप, अन्यथा इस तरह एक ही (यूटीसी निर्दिष्ट करने के लिए मत भूलना कर सकते हैं, यह जीत लिया ' टी काम):
date -d"1970-01-01 $curquarter seconds UTC"
निम्नलिखित तरीके dateदो बार कॉल करने के लिए अनावश्यक बनाते हैं ।
एक सिस्टम कॉल का ओवरहेड "साधारण" कमांड को अपने स्थानीय वातावरण में एक ही काम करने वाले बैश की तुलना में 100 गुना धीमा बना सकता है।
अद्यतन मेरी उपरोक्त टिप्पणी के बारे में एक त्वरित उल्लेख: "100 बार धीमा"। यह अब " 500 गुना धीमा" पढ़ सकता है ... मैं हाल ही में गिर गया (नहीं, आँख बंद करके चला गया) इस बहुत ही मुद्दे में। यहाँ लिंक है: परीक्षण फ़ाइल बनाने का तेज़ तरीका
eval $(date +Y=%Y\;m=%m\;d=%d\;H=%H\;M=%M)
[[ "$M" < "15" ]] && M=00 # cater for octal clash
M=$(((M/15)*15))
((M==0)) && M=00 # the math returns 0, so make it 00
echo $Y.$m.$d $H:$M
या
eval $(date +Y=%Y\;m=%m\;d=%d\;H=%H\;M=%M)
if [[ "$M" < "15" ]] ; then M=00
elif [[ "$M" < "30" ]] ; then M=15
elif [[ "$M" < "45" ]] ; then M=30
else M=45
fi
echo $Y.$m.$d $H:$M
दोनों वर्जन ही वापस आएंगे
2011.02.23 01:00
2011.02.23 01:15
2011.02.23 01:30
2011.02.23 01:45
यहाँ सभी 60 मान {00..59} के लिए TEST लूप वाला पहला है
for X in {00..59} ; ###### TEST
do ###### TEST
eval $(date +Y=%Y\;m=%m\;d=%d\;H=%H\;M=%M)
M=$X ###### TEST
[[ "$M" < "15" ]] && M=00 # cater for octal clash
M=$(((M/15)*15))
((M==0)) && M=00 # the math returns 0, so make it 00
echo $Y.$m.$d $H:$M
done ###### TEST
printfया sedयह भी कि "अनावश्यक" catबनाम <फ़ाइल एक नाटकीय वास्तविक रन-टाइम अंतर बनाती है। जब लूपिंग, मेरे "500 गुना धीमे" उदाहरण के रूप में .. तो ऐसा लगता है कि शेल का उपयोग जहां भी संभव हो, और dateबैच प्रक्रिया जैसी किसी कार्यक्रम की अनुमति है, मेरा मतलब है .. जैसे। गिल्स का लेफ्ट-पैड-0 उदाहरण, बनाम
यहां शेल में तिथियों पर काम करने का एक तरीका है। dateघटकों को प्राप्त करने के लिए पहले कॉल करें , और घटकों के साथ स्थितीय मापदंडों ( $1, $2आदि) को भरें (ध्यान दें कि यह इन दुर्लभ मामलों में से एक है जहां आप $(…)दोहरे उद्धरण के बाहर का उपयोग करना चाहते हैं , स्ट्रिंग को शब्दों में तोड़ने के लिए)। फिर अंकगणित, परीक्षण, या जो कुछ भी आपको घटकों पर करने की आवश्यकता है, करें। अंत में घटकों को इकट्ठा करें।
अंकगणित वाला हिस्सा थोड़ा मुश्किल हो सकता है क्योंकि गोले 0एक अष्टक उपसर्ग के रूप में मानते हैं ; उदाहरण के लिए यहाँ $(($5/15))घंटे के 8 या 9 मिनट में विफल हो जाएगा। चूँकि अधिकांश प्रमुख हैं 0, ${5#0}अंकगणित के लिए सुरक्षित है। 100 जोड़ना और बाद में अलग 1करना आउटपुट में अंकों की निश्चित संख्या प्राप्त करने का एक तरीका है।
set $(date "+%Y %m %d %H %M")
m=$((100+15*(${5#0}/15)))
last_quarter_hour="$1.$2.$3 $4:${m#1}"
हो सकता है कि इससे कोई फर्क नहीं पड़ता हो, लेकिन आप मेरे बहुत ही डेटट्यूट्स को आजमा सकते हैं । मिनटों तक गोलाई (नीचे) droundऔर एक नकारात्मक तर्क के साथ किया जाता है :
dround now /-15m
=>
2012-07-11T13:00:00
या अपने प्रारूप का पालन करने के लिए:
dround now /-15m -f '%Y.%m.%d %H:%M'
=>
2012.07.11 13:00
dateutils.dround '2018-11-12 13:55' -15mपैदा करता 2018-11-12T13:15:00है 2018-11-12T13:45:00।
/-15mयानी घंटे के अगले 15 मिनट तक अगले दौर में। इस सुविधा को अधिक बोझिल वाक्यविन्यास मिला क्योंकि यह कम मानों को स्वीकार करता है, / -13 m उदाहरण के लिए संभव नहीं है क्योंकि 13 60 का भाजक नहीं है (घंटे में मिनट)
कुछ शेल बाहरी dateकमांड को कॉल किए बिना काम करने में सक्षम हैं :
ksh a=$(printf '%(%s)T\n'); printf '%(%Y.%m.%d %H:%M)T\n' "#$((a-a%(15*60)))"
bash a=$(printf '%(%s)T\n'); printf '%(%Y.%m.%d %H:%M)T\n' "$((a-a%(15*60)))"
zsh zmodload zsh/datetime; a=$EPOCHSECONDS; strftime '%Y-%m-%d %H:%M' $((a-a%(15*60)))
उपरोक्त तीनों स्थानीय (UTC नहीं) समय प्रदान करते हैं। यदि आवश्यक हो तो एक प्रमुख TZ = UTC0 का उपयोग करें।
Ksh और bash सिंटैक्स लगभग समान है ( #ksh में आवश्यक को छोड़कर )। Zsh को एक मॉड्यूल लोड करने की आवश्यकता होती है (zsh वितरण के साथ शामिल)।
यह भी (GNU) awk के साथ करना संभव है:
gawk awk 'BEGIN{t=systime();print strftime("%Y.%m.%d %H:%M",t-t%(15*60),1)}'
यदि स्थानीय जरूरत है तो यह एक यूटीसी परिणाम (अंतिम 1को बदलें 0) प्रदान करता है। लेकिन एक बाहरी awk या एक बाहरी zsh मॉड्यूल लोड करना कॉलिंग दिनांक के समान ही धीमा हो सकता है:
जीएनयू की तारीख a=$(date +%s); date -ud "@$((a-a%(15*60)))" +'%Y.%m.%d %H:%M'
एक छोटा निष्पादन योग्य busyboxसमान परिणाम प्रदान कर सकता है:
बिजीबॉक्स की तारीख a=$(busybox date +%s);busybox date -ud "@$((a-a%(15*60)))" +'%Y.%m.%d %H:%M'
ध्यान दें कि यदि व्यस्त बॉक्स PATH की निर्देशिका में उन नामों से जुड़ा हुआ है तो अग्रणी व्यस्त शब्द छोड़ा जा सकता है।
दोनों dateऔर busybox dateऊपर यूटीसी बार प्रिंट करेंगे। -uस्थानीय समय के लिए विकल्प निकालें ।
यदि आपके ओएस में तारीख का अधिक सीमित संस्करण है (और वह है जो आपको उपयोग करना होगा) तो कोशिश करें:
a=$(date +%s); a=$(( a-a%(15*60) ))
date -d"1970-01-01 $a seconds UTC" +'%Y.%m.%d %H:%M'
या, अगर FreeBSD में, कोशिश करें:
a=$(date +%s); a=$(( a-a%(15*60) ))
date -r "$a" +'%Y.%m.%d %H:%M'
यदि आप दो बार कॉलिंग डेट के साथ रह सकते हैं, तो यह सोलारिस पर काम करता है:
date +"%Y.%m.%d %H:$(( $(date +'%M') / 15 * 15 ))"
टिप्पणी की ओर से संपादित:
date +"%Y.%m.%d %H:$(( $(date +'%M') / 15 * 15 ))" | sed 's/:0$/:00/'
अपनी सटीक आवश्यकता के बारे में निश्चित नहीं हैं। हालांकि, यदि आप 15 मिनट के बाद का समय उत्पन्न करना चाहते हैं, तो आप कुछ का उपयोग कर सकते हैं date -d '+15 min'। आउटपुट नीचे दिखाया गया है:
$ date; date -d '+15 min'
Tue Feb 22 18:12:39 IST 2011
Tue Feb 22 18:27:39 IST 2011