सेकंड
बीते हुए समय (सेकंड में) को मापने के लिए हमें चाहिए:
- एक पूर्णांक जो बीते हुए सेकंड की गिनती का प्रतिनिधित्व करता है और
- इस तरह के पूर्णांक को एक प्रयोग करने योग्य प्रारूप में बदलने का तरीका।
बीता हुआ सेकंड का पूर्णांक मान:
ऐसे पूर्णांक को एक प्रयोग करने योग्य प्रारूप में बदलें
बैश आंतरिक printfसीधे कर सकते हैं:
$ TZ=UTC0 printf '%(%H:%M:%S)T\n' 12345
03:25:45
उसी प्रकार
$ elapsedseconds=$((12*60+34))
$ TZ=UTC0 printf '%(%H:%M:%S)T\n' "$elapsedseconds"
00:12:34
लेकिन यह 24 घंटे से अधिक की अवधि के लिए विफल हो जाएगा, क्योंकि हम वास्तव में एक वॉलकॉक समय प्रिंट करते हैं, वास्तव में एक अवधि नहीं:
$ hours=30;mins=12;secs=24
$ elapsedseconds=$(( ((($hours*60)+$mins)*60)+$secs ))
$ TZ=UTC0 printf '%(%H:%M:%S)T\n' "$elapsedseconds"
06:12:24
विस्तार के प्रेमियों के लिए, bash-hackers.org से :
%(FORMAT)Tप्रारूप-स्ट्रिंग के लिए FORMAT का उपयोग करने के परिणामस्वरूप दिनांक-समय स्ट्रिंग को आउटपुट करता है strftime(3)। संबद्ध तर्क ईपॉच , या -1 (वर्तमान समय) या -2 (शेल स्टार्टअप समय) के बाद से सेकंड की संख्या है । यदि कोई संगत तर्क नहीं दिया जाता है, तो वर्तमान समय का उपयोग डिफ़ॉल्ट के रूप में किया जाता है।
तो आप सिर्फ कॉल करना चाह सकते हैं textifyDuration $elpasedsecondsजहां textifyDurationअवधि मुद्रण का एक और कार्यान्वयन अभी तक है:
textifyDuration() {
local duration=$1
local shiff=$duration
local secs=$((shiff % 60)); shiff=$((shiff / 60));
local mins=$((shiff % 60)); shiff=$((shiff / 60));
local hours=$shiff
local splur; if [ $secs -eq 1 ]; then splur=''; else splur='s'; fi
local mplur; if [ $mins -eq 1 ]; then mplur=''; else mplur='s'; fi
local hplur; if [ $hours -eq 1 ]; then hplur=''; else hplur='s'; fi
if [[ $hours -gt 0 ]]; then
txt="$hours hour$hplur, $mins minute$mplur, $secs second$splur"
elif [[ $mins -gt 0 ]]; then
txt="$mins minute$mplur, $secs second$splur"
else
txt="$secs second$splur"
fi
echo "$txt (from $duration seconds)"
}
GNU की तारीख
तैयार समय प्राप्त करने के लिए हमें बाहरी उपकरण (GNU दिनांक) का उपयोग कई तरीकों से करना चाहिए, लगभग एक साल की लंबाई तक और नैनोकंडों सहित।
तारीख के अंदर गणित।
बाहरी अंकगणित की कोई आवश्यकता नहीं है, यह सब एक चरण में करें date:
date -u -d "0 $FinalDate seconds - $StartDate seconds" +"%H:%M:%S"
हां, 0कमांड स्ट्रिंग में एक शून्य है। इसकी जरूरत है।
यह मानकर कि आप date +"%T"कमांड को कमांड में बदल सकते हैं date +"%s"इसलिए मान सेकंड में संग्रहीत (मुद्रित) होंगे।
ध्यान दें कि कमांड निम्न तक सीमित है:
$StartDateऔर $FinalDateसेकंड के सकारात्मक मूल्य ।
- मान
$FinalDateइससे बड़ा (बाद में समय में) है $StartDate।
- 24 घंटे से कम समय का अंतर।
- आप घंटे, मिनट और सेकंड के साथ एक आउटपुट स्वरूप स्वीकार करते हैं। बदलना बहुत आसान है।
- यह यू यूटीसी समय का उपयोग करने के लिए स्वीकार्य है। "डीएसटी" और स्थानीय समय सुधार से बचने के लिए।
आप तो चाहिए का उपयोग 10:33:56स्ट्रिंग, ठीक है, बस इसे सेकंड, में बदलने का
भी, शब्द सेकंड सेकंड के रूप में संक्षिप्त किया जा सकता है:
string1="10:33:56"
string2="10:36:10"
StartDate=$(date -u -d "$string1" +"%s")
FinalDate=$(date -u -d "$string2" +"%s")
date -u -d "0 $FinalDate sec - $StartDate sec" +"%H:%M:%S"
ध्यान दें कि सेकंड का समय रूपांतरण (जैसा कि ऊपर प्रस्तुत किया गया है) "यह" दिन (आज) की शुरुआत के सापेक्ष है।
इस अवधारणा को नैनोसेकंड तक बढ़ाया जा सकता है, जैसे:
string1="10:33:56.5400022"
string2="10:36:10.8800056"
StartDate=$(date -u -d "$string1" +"%s.%N")
FinalDate=$(date -u -d "$string2" +"%s.%N")
date -u -d "0 $FinalDate sec - $StartDate sec" +"%H:%M:%S.%N"
यदि अब (364 दिनों तक) समय के अंतर की गणना करने की आवश्यकता है, तो हमें संदर्भ के रूप में (कुछ) वर्ष की शुरुआत और प्रारूप मान %j(वर्ष में दिन संख्या ) का उपयोग करना चाहिए :
के समान:
string1="+10 days 10:33:56.5400022"
string2="+35 days 10:36:10.8800056"
StartDate=$(date -u -d "2000/1/1 $string1" +"%s.%N")
FinalDate=$(date -u -d "2000/1/1 $string2" +"%s.%N")
date -u -d "2000/1/1 $FinalDate sec - $StartDate sec" +"%j days %H:%M:%S.%N"
Output:
026 days 00:02:14.340003400
अफसोस की बात है कि इस मामले में, हमें मैन्युअल रूप 1से किसी को दिन की संख्या से घटाना होगा । दिनांक आदेश वर्ष के पहले दिन को 1 के रूप में देखें। यह मुश्किल नहीं है ...
a=( $(date -u -d "2000/1/1 $FinalDate sec - $StartDate sec" +"%j days %H:%M:%S.%N") )
a[0]=$((10#${a[0]}-1)); echo "${a[@]}"
सेकंड की लंबी संख्या का उपयोग यहाँ मान्य और प्रलेखित है:
https://www.gnu.org/software/coreutils/manual/html_node/Examples-of-date.html#Examples-of-date
बिजीबॉक्स डेट
छोटे उपकरणों में उपयोग किया जाने वाला एक उपकरण (स्थापित करने के लिए एक बहुत छोटा निष्पादन योग्य): बिजीबॉक्स।
या तो व्यस्त समय की तारीख के लिए एक लिंक बनाएं:
$ ln -s /bin/busybox date
फिर इसे कॉल करके date(इसे PATH शामिल निर्देशिका में रखें) का उपयोग करें।
या एक उपनाम बनाएं जैसे:
$ alias date='busybox date'
बिजीबॉक्स डेट का एक अच्छा विकल्प है: -D को इनपुट समय का प्रारूप प्राप्त करने के लिए। यह समय के रूप में उपयोग किए जाने वाले बहुत सारे प्रारूप खोलता है। -D विकल्प का उपयोग करके हम समय को सीधे 10:33:56 बदल सकते हैं:
date -D "%H:%M:%S" -d "10:33:56" +"%Y.%m.%d-%H:%M:%S"
और जैसा कि आप ऊपर दिए गए कमांड के आउटपुट से देख सकते हैं, दिन को "आज" माना जाता है। युग आरंभ करने का समय पाने के लिए:
$ string1="10:33:56"
$ date -u -D "%Y.%m.%d-%H:%M:%S" -d "1970.01.01-$string1" +"%Y.%m.%d-%H:%M:%S"
1970.01.01-10:33:56
बिजीबॉक्स की तारीख भी समय प्राप्त कर सकते हैं (ऊपर प्रारूप में) बिना -D:
$ date -u -d "1970.01.01-$string1" +"%Y.%m.%d-%H:%M:%S"
1970.01.01-10:33:56
और आउटपुट प्रारूप भी सेकंड के बाद से हो सकता है।
$ date -u -d "1970.01.01-$string1" +"%s"
52436
दोनों समय के लिए, और थोड़ा बैश गणित (बिजीबॉक्स गणित नहीं कर सकता, फिर भी):
string1="10:33:56"
string2="10:36:10"
t1=$(date -u -d "1970.01.01-$string1" +"%s")
t2=$(date -u -d "1970.01.01-$string2" +"%s")
echo $(( t2 - t1 ))
या स्वरूपित:
$ date -u -D "%s" -d "$(( t2 - t1 ))" +"%H:%M:%S"
00:02:14
timeकमांड का उपयोग नहीं कर सकते थे ?