2012-11-16 20 views
25

में स्वरूपित समय के लिए सेकेंड में समय अवधि को कनवर्ट करें मेरे पास $ i का एक चर है जो शेल स्क्रिप्ट में सेकेंड है, और मैं इसे 24 घंटे एचएच: एमएम: एसएस में बदलने की कोशिश कर रहा हूं। क्या यह खोल में संभव है?शैल

उत्तर

60

यहाँ आप = के लिए वास्तव में क्या देख रहे हैं करने के लिए) एक मजेदार hacky तरीका है

date -u -d @${i} +"%T" 

स्पष्टीकरण:

  • date उपयोगिता, स्ट्रिंग से, में आप एक समय निर्दिष्ट कर सकते हैं 1 9 70-01-01 00:00:00 यूटीसी के बाद से सेकंड, और इसे निर्दिष्ट प्रारूप में आउटपुट करें।
  • -u विकल्प UTC समय प्रदर्शित करने के लिए है, इसलिए यह नहीं
  • निम्नलिखित भागों जीएनयू date विशिष्ट (लिनक्स) कर रहे हैं (प्रारंभ समय 1970 से यूटीसी में है के बाद से) समय क्षेत्र ऑफसेट में कारक करता है:
    • -d हिस्सा date बताता है स्ट्रिंग से समय की जानकारी को स्वीकार करने के बजाय now
    • का उपयोग कर @${i} हिस्सा है आप कैसे बता date कि $i सेकंड में है
  • +"%T" आपके आउटपुट को स्वरूपित करने के लिए है। man date पृष्ठ से: %T time; same as %H:%M:%S। चूंकि हम केवल HH:MM:SS भाग की परवाह करते हैं, यह फिट बैठता है!
+2

त्वरित और प्रभावशाली! –

+1

मैक/यूनिक्स में यह कैसे काम करता है इसके लिए नीचे एलन टैम के उत्तर को देखें: http://stackoverflow.com/a/21822510/243709 –

+5

मुझे लगता है कि यह केवल 86400 से कम 'i' के लिए काम करता है:' i = 86400; date -u -d @ $ {i} + "% T" 'आपको 00: 00: 00' – galaux

0

$i युग के बाद से दूसरे में कुछ दिनांक को दर्शाता है, तो आप

date -u -d @$i +%H:%M:%S 

साथ इसे प्रदर्शित कर सकता है, लेकिन आप लगता है कि $i एक अंतराल (जैसे कुछ अवधि) नहीं एक तारीख है लगता है, और फिर मैं डॉन समझ में नहीं आता कि आप क्या चाहते हैं।

+0

+% टी के साथ @ सैम्पसन-चेन के समान (डुप्लिकेट)। –

14

एक और दृष्टिकोण: अंकगणित

i=6789 
((sec=i%60, i/=60, min=i%60, hrs=i/60)) 
timestamp=$(printf "%d:%02d:%02d" $hrs $min $sec) 
echo $timestamp 

1:53:09

+1

ओपी के बाद क्या नहीं हो सकता था, लेकिन मुझे वही था जो मुझे चाहिए था। धन्यवाद। –

10

-d तर्क coreutils (लिनक्स) केवल से तारीख करने के लिए लागू होता है पैदा करता है।

बीएसडी/ओएस एक्स में, का उपयोग

date -u -r $i +%T 
+0

AIX पर काम नहीं करते :( – zack

1

यहाँ मेरी साइट पर मेरी algo/लिपि सहायकों है: http://ram.kossboss.com/seconds-to-split-time-convert/ मैं इस्तेमाल किया इस elogant यहां से algo: Convert seconds to hours, minutes, seconds

convertsecs() { 
((h=${1}/3600)) 
((m=(${1}%3600)/60)) 
((s=${1}%60)) 
printf "%02d:%02d:%02d\n" $h $m $s 
} 
TIME1="36" 
TIME2="1036" 
TIME3="91925" 

echo $(convertsecs $TIME1) 
echo $(convertsecs $TIME2) 
echo $(convertsecs $TIME3) 

का उदाहरण मेरा दूसरा दिन, घंटा, मिनट, दूसरा कनवर्टर:

# convert seconds to day-hour:min:sec 
convertsecs2dhms() { 
((d=${1}/(60*60*24))) 
((h=(${1}%(60*60*24))/(60*60))) 
((m=(${1}%(60*60))/60)) 
((s=${1}%60)) 
printf "%02d-%02d:%02d:%02d\n" $d $h $m $s 
# PRETTY OUTPUT: uncomment below printf and comment out above printf if you want prettier output 
# printf "%02dd %02dh %02dm %02ds\n" $d $h $m $s 
} 
# setting test variables: testing some constant variables & evaluated variables 
TIME1="36" 
TIME2="1036" 
TIME3="91925" 
# one way to output results 
((TIME4=$TIME3*2)) # 183850 
((TIME5=$TIME3*$TIME1)) # 3309300 
((TIME6=100*86400+3*3600+40*60+31)) # 8653231 s = 100 days + 3 hours + 40 min + 31 sec 
# outputting results: another way to show results (via echo & command substitution with   backticks) 
echo $TIME1 - `convertsecs2dhms $TIME1` 
echo $TIME2 - `convertsecs2dhms $TIME2` 
echo $TIME3 - `convertsecs2dhms $TIME3` 
echo $TIME4 - `convertsecs2dhms $TIME4` 
echo $TIME5 - `convertsecs2dhms $TIME5` 
echo $TIME6 - `convertsecs2dhms $TIME6` 

# OUTPUT WOULD BE LIKE THIS (If none pretty printf used): 
# 36 - 00-00:00:36 
# 1036 - 00-00:17:16 
# 91925 - 01-01:32:05 
# 183850 - 02-03:04:10 
# 3309300 - 38-07:15:00 
# 8653231 - 100-03:40:31 
# OUTPUT WOULD BE LIKE THIS (If pretty printf used): 
# 36 - 00d 00h 00m 36s 
# 1036 - 00d 00h 17m 16s 
# 91925 - 01d 01h 32m 05s 
# 183850 - 02d 03h 04m 10s 
# 3309300 - 38d 07h 15m 00s 
# 1000000000 - 11574d 01h 46m 40s 
0

मैं सी खोल उपयोग करते हैं, इस तरह:

#! /bin/csh -f 

set begDate_r = `date +%s` 
set endDate_r = `date +%s` 

set secs = `echo "$endDate_r - $begDate_r" | bc` 
set h = `echo $secs/3600 | bc` 
set m = `echo "$secs/60 - 60*$h" | bc` 
set s = `echo $secs%60 | bc` 

echo "Formatted Time: $h HOUR(s) - $m MIN(s) - $s SEC(s)" 
0

को जारी रखते हुए @ Daren`s जवाब, बस स्पष्ट होना: आप अपना समय क्षेत्र करने के लिए रूपांतरण का उपयोग करना चाहते हैं, तो का उपयोग नहीं करते "यू" स्विच करें, जैसे: date -d @$i +%T या कुछ मामलों में date -d @"$i" +%T