2010-09-09 15 views
5

एक बैश स्क्रिप्ट में, यदि मेरे पास एक संख्या है जो एक समय का प्रतिनिधित्व करती है, तो फॉर्म hhmmss (या hmmss) में, 10 मिनट घटाने का सबसे अच्छा तरीका क्या है?बैश: किसी दिए गए समय से 10 मिनट घटाकर

यानी, 90000 -> 85000

उत्तर

13

इसमें कुछ समय मुश्किल है। (क्योंकि अन्यथा यह प्रधानमंत्री मान रहा है यूटीसी का उपयोग कर)

date --date '-10 min' 

निर्दिष्ट घंटे मिनट सेकंड:: दिनांक सामान्य जोड़तोड़ कर सकते हैं, यानी आप कर सकते हैं

date --date '11:45:30 UTC -10 min' 

अपनी तिथि स्ट्रिंग विभाजित करने के लिए, एक ही रास्ता मैं के बारे में सोच सकते हैं विस्तार सबस्ट्रिंग है:

:

a=114530 
date --date "${a:0:2}:${a:2:2}:${a:4:2} UTC -10 min" 

और तुम सिर्फ hhmmss वापस पाने के लिए चाहते हैं, तो

+0

उत्तर के लिए धन्यवाद। तो स्पष्ट करने के लिए ... समय वर्तमान समय नहीं है ... यह एक पांच या छह अंक संख्या स्क्रिप्ट में पैरामीटर के रूप में पारित किया गया है ... क्या यह दृष्टिकोण इसके लिए काम करेगा? –

+0

@RogerMoore हाँ, यही कारण है कि मैं --डेट का उपयोग करता हूं। इसे "एचएच: एमएम: एसएस यूटीसी" के रूप में लिखा जाना चाहिए क्योंकि अन्यथा तारीख इसे गलत तरीके से समझने में सक्षम नहीं होगी, लेकिन यह आपके उद्देश्य के लिए काम करना प्रतीत होता है। मुझे यकीन नहीं है कि जब आप एचएच के रूप में एक समय में गुजरते हैं तो क्या होता है: मिमी: एस, आप मध्यरात्रि और दोपहर के आसपास भी इसका सबसे अच्छा परीक्षण करते हैं। – wds

1

क्यों न केवल युग का उपयोग करें और फिर 600 को बंद करें?

$ echo "`date +%s` - 600"| bc; date 
1284050588 
Thu Sep 9 11:53:08 CDT 2010 
$ date -d '1970-01-01 UTC 1284050588 seconds' +"%Y-%m-%d %T %z" 
2010-09-09 11:43:08 -0500 
+0

उत्तर के लिए धन्यवाद। बात यह है कि मुझे वर्तमान समय के आधार पर ऐसा करने की आवश्यकता नहीं है। यह एक मनमाना समय स्क्रिप्ट में पांच या छह अंक संख्या के रूप में पारित किया जाएगा। –

+1

आमतौर पर अपने स्वयं के स्टाइल/फीचर्स को पट्टी करना और पोस्ट करते समय "$" जैसे पारंपरिक संकेत का उपयोग करना एक अच्छा विचार है। (मैंने इन सवालों के जवाब देने से पहले 'PS1 =' \ $ '' सेट किया है, इसलिए मैं अभी भी कॉपी-पेस्ट कर सकता हूं।) –

1

चूंकि आप एक 5 या 6 अंकों की संख्या है, तो आप स्ट्रिंग परिवर्तन करने से पहले यह पैड करने के लिए है:

$ t=90100 
$ while [ ${#t} -lt 6 ]; do t=0$t; done 
$ echo $t 
090100 
$ date +%H%M%S --utc -d"today ${t:0:2}:${t:2:2}:${t:4:2} UTC - 10 minutes" 
085100 

नोट दोनों --utc और यूटीसी यकीन है कि सिस्टम के करने की आवश्यकता है टाइमज़ोन परिणामों को प्रभावित नहीं करता है।

बैश के भीतर गणित के लिए (यानी $(( और ((), अग्रणी शून्य संख्या को ऑक्टल के रूप में व्याख्या करने का कारण बनती है। हालांकि, वैसे भी, आपका डेटा नंबर की तरह अधिक स्ट्रिंग-जैसा (एक विशेष प्रारूप के साथ) है। मैंने ऊपर थोड़ी देर लूप का उपयोग किया है क्योंकि ऐसा लगता है कि आप इसे एक संख्या के रूप में देख रहे हैं और इस प्रकार 12:01 बजे 100 मिल सकते हैं।

1

बैश का मेरा संस्करण उपरोक्त उपयोग के रूप में -d या --date का समर्थन नहीं करता है। हालांकि, सही ढंग से 0-पैड किए गए इनपुट को मानते हुए, यह काम करता है

$ input_time=130503 # meaning "1:05:03 PM" 

# next line calculates epoch seconds for today's date at stated time 
$ epoch_seconds=$(date -jf '%H%M%S' $input_time '+%s') 

# the 600 matches the OP's "subtract 10 minutes" spec. Note: Still relative to "today" 
$ calculated_seconds=$((epoch_seconds - 600)) # bc would work here but $((...)) is builtin 

# +%H%M%S formats the result same as input, but you can do what you like here 
$ echo $(date -r $calculated_seconds '+%H%M%S') 

# output is 125503: Note that the hour rolled back as expected. 
संबंधित मुद्दे