দিন / ঘন্টা / মিনিট / সেকেন্ড হিসাবে সেকেন্ড প্রদর্শন?


31

বাশ-এ মানব-পঠনযোগ্য সময় হিসাবে সহজেই সেকেন্ডগুলি বিন্যাস করা সম্ভব?

আমি এটিকে তারিখ হিসাবে ফর্ম্যাট করতে চাই না, তবে দিন / ঘন্টা / মিনিট ইত্যাদি হিসাবে ...


আপনি দয়া করে একটি উদাহরণ / বেশ কয়েকটি উদাহরণ প্রদান করতে পারেন?
গ্যাবে

1
আপনি কি বলছেন যে আপনার একটি মহাকাশ আছে, নাকি যুগ যুগের আগে?
পল টমবলিন

উত্তর:


41

আপনি এর মতো কিছু ব্যবহার করতে পারেন:

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

11

সবচেয়ে সহজ এবং পরিষ্কার উপায় হ'ল এটি একটি লাইনার (এখানে জিএনইউ ধরে নিচ্ছেন 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


যদি আপনার সময়কাল সর্বদা এক দিনেরও কম থাকে তবে আপনি +%Tdate +%T "1970-01-01 + ${seconds} seconds"21:33:09
সময়গুলির

7

ক্রেডিট স্টাফেন গিমেনেজকে যায় তবে কেউ যদি কেবলমাত্র এক মিনিটেরও কম সময়ের জন্য এখানে সেকেন্ড প্রদর্শন করতে চান তবে আমার ব্যবহৃত সংস্করণটি আমি ব্যবহার করি (স্থির বহুগুণ সহ):

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সুন্দর আউটপুট পেতে দৌড়ে এসেছি ।
ফ্লিকফার্লি

3

আমি এটি এইভাবে করব:

$ 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 ... )প্রদত্ত সংখ্যার সেকেন্ডের জন্য ঘন্টা, মিনিট এবং সেকেন্ড তৈরি করে।


2

আমি উপরের ডিসপ্লেটাইম ফাংশনটি পরিবর্তন করেছি ... নীচে:

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
}

কারণ আমি সর্বদা এইচ এইচ: এমএম: এসএস দেখতে চাই, তারা জিরো হলেও।


1

আমি আতির উত্তরটি তৈরি করছি যা একটি ধারণা হিসাবে আমার পছন্দ হয়েছিল।

আপনি বাশ বিল্টিন দিয়ে এটি করতে পারেন 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

নোট করুন যে বাশ এর ব্যাশ -4.2-আলফা দিয়ে printfএই %(datefmt)Tসূচনাটি প্রবর্তন করেছে ।
বিশপ

-1

এখানে একটি

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

-2

date --date '@1005454800'আপনাকে দেয় Sun Nov 11 00:00:00 EST 2001, যা ইউনিক্সের যুগের 1005454800 সেকেন্ড পরে is আপনি + + ফরমেট বিকল্পের সাথে ফর্ম্যাট করতে পারেন।


7
এটি একটি তারিখ, একটি সময়কাল নয়, যা সম্পর্কে প্রশ্নটি জিজ্ঞাসা করেছিল।
গিলস 'দুষ্ট হওয়া বন্ধ করুন'
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.