বাশ-এ মানব-পঠনযোগ্য সময় হিসাবে সহজেই সেকেন্ডগুলি বিন্যাস করা সম্ভব?
আমি এটিকে তারিখ হিসাবে ফর্ম্যাট করতে চাই না, তবে দিন / ঘন্টা / মিনিট ইত্যাদি হিসাবে ...
বাশ-এ মানব-পঠনযোগ্য সময় হিসাবে সহজেই সেকেন্ডগুলি বিন্যাস করা সম্ভব?
আমি এটিকে তারিখ হিসাবে ফর্ম্যাট করতে চাই না, তবে দিন / ঘন্টা / মিনিট ইত্যাদি হিসাবে ...
উত্তর:
আপনি এর মতো কিছু ব্যবহার করতে পারেন:
function displaytime {
local T=$1
local D=$((T/60/60/24))
local H=$((T/60/60%24))
local M=$((T/60%60))
local S=$((T%60))
(( $D > 0 )) && printf '%d days ' $D
(( $H > 0 )) && printf '%d hours ' $H
(( $M > 0 )) && printf '%d minutes ' $M
(( $D > 0 || $H > 0 || $M > 0 )) && printf 'and '
printf '%d seconds\n' $S
}
উদাহরণ:
$ displaytime 11617
3 hours 13 minutes and 37 seconds
$ displaytime 42
42 seconds
$ displaytime 666
11 minutes and 6 seconds
সবচেয়ে সহজ এবং পরিষ্কার উপায় হ'ল এটি একটি লাইনার (এখানে জিএনইউ ধরে নিচ্ছেন date
):
যদি সেকেন্ডের সংখ্যা হয় তবে বলুন:
seconds=123456789 # as in one of the answers above
eval "echo $(date -ud "@$seconds" +'$((%s/3600/24)) days %H hours %M minutes %S seconds')"
-> আউটপুট: 1428 days 21 hours 33 minutes 09 seconds
+%T
date +%T "1970-01-01 + ${seconds} seconds"
21:33:09
ক্রেডিট স্টাফেন গিমেনেজকে যায় তবে কেউ যদি কেবলমাত্র এক মিনিটেরও কম সময়ের জন্য এখানে সেকেন্ড প্রদর্শন করতে চান তবে আমার ব্যবহৃত সংস্করণটি আমি ব্যবহার করি (স্থির বহুগুণ সহ):
converts()
{
local t=$1
local d=$((t/60/60/24))
local h=$((t/60/60%24))
local m=$((t/60%60))
local s=$((t%60))
if [[ $d > 0 ]]; then
[[ $d = 1 ]] && echo -n "$d day " || echo -n "$d days "
fi
if [[ $h > 0 ]]; then
[[ $h = 1 ]] && echo -n "$h hour " || echo -n "$h hours "
fi
if [[ $m > 0 ]]; then
[[ $m = 1 ]] && echo -n "$m minute " || echo -n "$m minutes "
fi
if [[ $d = 0 && $h = 0 && $m = 0 ]]; then
[[ $s = 1 ]] && echo -n "$s second" || echo -n "$s seconds"
fi
echo
}
পসিক্সের বিকল্প উদাহরণ:
converts(){
t=$1
d=$((t/60/60/24))
h=$((t/60/60%24))
m=$((t/60%60))
s=$((t%60))
if [ $d -gt 0 ]; then
[ $d = 1 ] && printf "%d day " $d || printf "%d days " $d
fi
if [ $h -gt 0 ]; then
[ $h = 1 ] && printf "%d hour " $h || printf "%d hours " $h
fi
if [ $m -gt 0 ]; then
[ $m = 1 ] && printf "%d minute " $m || printf "%d minutes " $m
fi
if [ $d = 0 ] && [ $h = 0 ] && [ $m = 0 ]; then
[ $s = 1 ] && printf "%d second" $s || printf "%d seconds" $s
fi
printf '\n'
}
convert $s
সুন্দর আউটপুট পেতে দৌড়ে এসেছি ।
আমি এটি এইভাবে করব:
$ seconds=123456789; echo $((seconds/86400))" days "$(date -d "1970-01-01 + $seconds seconds" "+%H hours %M minutes %S seconds")
1428 days 21 hours 33 minutes 09 seconds
$
উপরের এক লাইনারটি এখানেই ভেঙে গেছে যাতে এটি বুঝতে সহজ হয়:
$ seconds=123456789
$ echo $((seconds/86400))" days"\
$(date -d "1970-01-01 + $seconds seconds" "+%H hours %M minutes %S seconds")
উপরের দিকে আমি $( ... )
সাব-কমান্ডের ভিতরে চলমান অন্য কমান্ডের আউটপুট প্রতিধ্বনি করছি run সেই সাব-কমান্ডটি এটি করছে, দিনের সংখ্যা গণনা করে (সেকেন্ড / 86400), তারপরে date
অন্য সাব-কমান্ডে কমান্ডটি ব্যবহার করে $(date -d ... )
প্রদত্ত সংখ্যার সেকেন্ডের জন্য ঘন্টা, মিনিট এবং সেকেন্ড তৈরি করে।
আমি উপরের ডিসপ্লেটাইম ফাংশনটি পরিবর্তন করেছি ... নীচে:
seconds2time ()
{
T=$1
D=$((T/60/60/24))
H=$((T/60/60%24))
M=$((T/60%60))
S=$((T%60))
if [[ ${D} != 0 ]]
then
printf '%d days %02d:%02d:%02d' $D $H $M $S
else
printf '%02d:%02d:%02d' $H $M $S
fi
}
কারণ আমি সর্বদা এইচ এইচ: এমএম: এসএস দেখতে চাই, তারা জিরো হলেও।
আমি আতির উত্তরটি তৈরি করছি যা একটি ধারণা হিসাবে আমার পছন্দ হয়েছিল।
আপনি বাশ বিল্টিন দিয়ে এটি করতে পারেন printf
যা আর্গুমেন্ট হিসাবে পর্বের সময় থেকে কয়েক সেকেন্ড সময় নেবে। চালানোর জন্য কাঁটাচামচ করার দরকার নেই date
।
আপনাকে ইউটিসির জন্য সময় অঞ্চল নির্ধারণ করতে printf
হবে কারণ এটি আপনার স্থানীয় সময় অঞ্চলের সময়কে ফর্ম্যাট করে এবং আপনি যদি ইউটিসি সময়ে না হন তবে আপনি ভুল উত্তর পেয়ে যাবেন।
$ seconds=123456789
$ TZ=UTC printf "%d days %(%H hours %M minutes %S seconds)T\n" $((seconds/86400)) $seconds
1428 days 21 hours 33 minutes 09 seconds
আমার স্থানীয় সময়ে (যা বর্তমানে এনজেডডিটি - +1300) আমি টাইমজোনটি সেট না করে থাকলে উত্তরটি ভুল
$ seconds=123456789
$ printf "%d days %(%H hours %M minutes %S seconds)T\n" $((seconds/86400)) $seconds
1428 days 09 hours 33 minutes 09 seconds
টাইমজোনটি নির্ধারণ ও ছাড়াই
$ seconds=$(( 3600 * 25))
$ printf "%d days %(%H hours %M minutes %S seconds)T\n" $((seconds/86400)) $seconds
1 days 13 hours 00 minutes 00 seconds
$ TZ=UTC printf "%d days %(%H hours %M minutes %S seconds)T\n" $((seconds/86400)) $seconds
1 days 01 hours 00 minutes 00 seconds
printf
এই %(datefmt)T
সূচনাটি প্রবর্তন করেছে ।
এখানে একটি
secs=378444
echo $(($secs/86400))d $(($(($secs - $secs/86400*86400))/3600))h:$(($(($secs - $secs/86400*86400))%3600/60))m:$(($(($secs - $secs/86400*86400))%60))s
আউটপুট:
4d 9h:7m:24s
date --date '@1005454800'
আপনাকে দেয় Sun Nov 11 00:00:00 EST 2001
, যা ইউনিক্সের যুগের 1005454800 সেকেন্ড পরে is আপনি + + ফরমেট বিকল্পের সাথে ফর্ম্যাট করতে পারেন।