แสดงวินาทีเป็นวัน / ชั่วโมง / นาที / วินาทีหรือไม่


31

เป็นไปได้หรือไม่ที่จะจัดรูปแบบวินาทีเป็นเวลาที่มนุษย์สามารถอ่านได้โดยง่ายในการทุบตี?

ฉันไม่ต้องการจัดรูปแบบเป็นวันที่ แต่เป็นจำนวนวัน / ชั่วโมง / นาทีเป็นต้น ...


คุณช่วยยกตัวอย่าง / ตัวอย่างหลายตัวอย่างได้ไหม?
เกบ

1
คุณกำลังบอกว่าคุณมีช่วงเวลาหรือวันที่ตั้งแต่ยุค
Paul Tomblin

คำตอบ:


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

วิธีที่ง่ายที่สุดและสะอาดที่สุดคือซับอันนี้ (ที่นี่สมมติว่า GNU 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
Yzmir Ramirez

7

เครดิตไปที่Stéphane Gimenezแต่ถ้ามีคนต้องการที่จะแสดงวินาทีเท่านั้นหากช่วงเวลาน้อยกว่าหนึ่งนาทีที่นี่เป็นรุ่นที่แก้ไขของฉันที่ฉันใช้ (รวมถึงพหูพจน์คงที่):

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
}

ตัวอย่างทางเลือกใน POSIX:

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เพื่อให้ได้ผลลัพธ์ที่น่ารัก
flickerfly

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")

ในข้างต้นฉันสะท้อนเอาท์พุทของคำสั่งอื่นที่ทำงานอยู่ใน$( ... )คำสั่งย่อย คำสั่งย่อยนั้นกำลังทำสิ่งนี้โดยคำนวณจำนวนวัน (วินาที / 86400) จากนั้นใช้dateคำสั่งในคำสั่งย่อยอื่น$(date -d ... )เพื่อสร้างชั่วโมงนาทีและวินาทีตามจำนวนวินาทีที่กำหนด


2

ฉันแก้ไขฟังก์ชั่น displaytime ด้านบน ... ดังนี้:

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
}

เพราะฉันอยากเห็น HH: MM: SS เสมอแม้ว่าจะเป็นศูนย์ก็ตาม


1

ฉันกำลังสร้างคำตอบของ atti ที่ฉันชอบเป็นความคิด

คุณสามารถทำได้ด้วย bash builtin printfซึ่งจะใช้เวลาไม่กี่วินาทีนับตั้งแต่ยุคเป็นข้อโต้แย้ง dateไม่จำเป็นต้องส้อมที่จะเรียกใช้

คุณต้องตั้งค่าเขตเวลาเป็น UTC สำหรับprintfเพราะมันจะจัดรูปแบบเวลาในเขตเวลาท้องถิ่นของคุณและคุณจะได้รับคำตอบที่ผิดถ้าคุณไม่ได้อยู่ในเวลา UTC

$ 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

ในเวลาท้องถิ่นของฉัน (ซึ่งปัจจุบันคือ NZDT - + 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

โปรดทราบว่า bash ของprintfแนะนำ%(datefmt)Tสัญลักษณ์นี้เริ่มต้นด้วย bash-4.2-alpha
อธิการ

-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 วินาทีหลังจากช่วงเวลา Unix คุณสามารถจัดรูปแบบที่มีตัวเลือกวันที่ + รูปแบบ


7
นั่นคือวันที่ไม่ใช่ช่วงเวลาที่คำถามถูกถาม
Gilles 'หยุดความชั่วร้าย'
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.