दिनांक: वर्तमान 15 मिनट का अंतराल प्राप्त करें


15

क्या कोई तरीका है जिससे मैं दिनांक कमांड या समान का उपयोग करके वर्तमान 15 मिनट का अंतराल प्राप्त कर सकता हूं?

जैसे कुछ तारीख %Y.%m.%d %H:%M मुझे दे देंगे 2011.02.22 10:19, मुझे कुछ चाहिए, 2011.02.22 10:15जो समय-समय पर पैदावार देता 10:15है 10:29

जवाबों:


17

आप वर्तमान यूनिक्स टाइमस्टैम्प को प्राप्त कर सकते हैं date "+%s", कुछ सरल गणित (मेरा उदाहरण है bash) के साथ वर्तमान तिमाही-घंटे का पता लगा सकते हैं और इसे बेहतर प्रारूप के साथ वापस प्रिंट कर सकते हैं date:

curdate=`date "+%s"`
curquarter=$(($curdate - ($curdate % (15 * 60))))
date -d"@$curquarter"

@अगर यह आपके ओएस पर काम करता है नहीं है एक टाइमस्टैम्प से आज की तारीख और समय निर्धारित करने की वाक्य रचना, आज तक एक जीएनयू विस्तार है, तो आप, अन्यथा इस तरह एक ही (यूटीसी निर्दिष्ट करने के लिए मत भूलना कर सकते हैं, यह जीत लिया ' टी काम):

date -d"1970-01-01 $curquarter seconds UTC"

5

निम्नलिखित तरीके 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 

1
स्पष्टीकरण के लिए - "सिस्टम कॉल" के द्वारा, आप का अर्थ है "कांटा / निष्पादित / प्रतीक्षा करें, जैसे सिस्टम () कॉल", सामान्य रूप से सिस्टम कॉल नहीं । (मैं इस बात का उल्लेख करता हूं क्योंकि उपयोगकर्ता / कर्नेल स्विच के कारण सिस्टम कॉल करने का प्रोग्राम के भीतर एक ओवरहेड भी है। यह यहां कोई विशेष मुद्दा नहीं है।)
mattdm

mattdm ... धन्यवाद .. मैं केवल 6 महीने के लिनक्स अनुभव से काम कर रहा हूं, इसलिए मैंने गलत वाक्यांश का उपयोग करने की काफी संभावना है, लेकिन मैं अनावश्यक कॉल द्वारा किए गए ओवरहेड्स के बारे में पढ़ता रहता हूं, और अपने स्वयं के परीक्षण के अपने अनुभव में। स्क्रिप्ट, मैंने कई उदाहरण देखे हैं जहाँ कॉलिंग printfया sedयह भी कि "अनावश्यक" catबनाम <फ़ाइल एक नाटकीय वास्तविक रन-टाइम अंतर बनाती है। जब लूपिंग, मेरे "500 गुना धीमे" उदाहरण के रूप में .. तो ऐसा लगता है कि शेल का उपयोग जहां भी संभव हो, और dateबैच प्रक्रिया जैसी किसी कार्यक्रम की अनुमति है, मेरा मतलब है .. जैसे। गिल्स का लेफ्ट-पैड-0 उदाहरण, बनाम
प्रिंटफ

3

यहां शेल में तिथियों पर काम करने का एक तरीका है। 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}"

"व्यापार के गुर" ... एक अच्छा। :)
पीटर

2

हो सकता है कि इससे कोई फर्क नहीं पड़ता हो, लेकिन आप मेरे बहुत ही डेटट्यूट्स को आजमा सकते हैं । मिनटों तक गोलाई (नीचे) droundऔर एक नकारात्मक तर्क के साथ किया जाता है :

dround now /-15m
=>
  2012-07-11T13:00:00

या अपने प्रारूप का पालन करने के लिए:

dround now /-15m -f '%Y.%m.%d %H:%M'
=>
  2012.07.11 13:00

क्या यह है कि आपके बर्तन अब कैसे काम करते हैं? का उपयोग कर -15 m मैं एक घंटे से पहले निकटतम 15 मिनट के लिए इनपुट रिवाइंड करता हूं: नहीं dateutils.dround '2018-11-12 13:55' -15mपैदा करता 2018-11-12T13:15:00है 2018-11-12T13:45:00

1
@JackDouglas उपकरण विकसित हो गए हैं, आप जो चाहते हैं वह अब है: /-15mयानी घंटे के अगले 15 मिनट तक अगले दौर में। इस सुविधा को अधिक बोझिल वाक्यविन्यास मिला क्योंकि यह कम मानों को स्वीकार करता है, / -13 m उदाहरण के लिए संभव नहीं है क्योंकि 13 60 का भाजक नहीं है (घंटे में मिनट)
hroptatyr

अच्छा, मुझे वह मिल गया जिसकी मुझे अब आवश्यकता है dateutils.dround '2018-11-12 12:52:31' /450s /-15m, धन्यवाद!

2

कुछ शेल बाहरी dateकमांड को कॉल किए बिना काम करने में सक्षम हैं :

a=$(printf '%(%s)T\n'); printf '%(%Y.%m.%d %H:%M)T\n' "#$((a-a%(15*60)))"
a=$(printf '%(%s)T\n'); printf '%(%Y.%m.%d %H:%M)T\n' "$((a-a%(15*60)))"
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 के साथ करना संभव है:

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'

1

यदि आप दो बार कॉलिंग डेट के साथ रह सकते हैं, तो यह सोलारिस पर काम करता है:

date +"%Y.%m.%d %H:$(( $(date +'%M') / 15 * 15 ))"

टिप्पणी की ओर से संपादित:

date +"%Y.%m.%d %H:$(( $(date +'%M') / 15 * 15 ))" | sed 's/:0$/:00/'

1
घंटे की पहली तिमाही में, यह 00 के बजाय केवल 0 के साथ एक मिनट आउटपुट का उत्पादन करेगा
पीटर।

सही है, यह मूल कमांड के बाद एक साधारण सेड है।
ddeimeke

एक और बग: यह H: 08 और H: 10 के बीच काम नहीं करता है। क्यों और एक तय के लिए मेरा जवाब देखें ।
गिलेस एसओ- बुराई को रोकना '

-1

अपनी सटीक आवश्यकता के बारे में निश्चित नहीं हैं। हालांकि, यदि आप 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

1
आपने प्रश्न को गलत समझा। बिंदु दिनांक (नीचे) को कई 15 मिनट के लिए गोल करना है।
गिल्स एसओ- बुराई को रोकना '
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.