초를 일/시/분/초로 표시하시겠습니까?

초를 일/시/분/초로 표시하시겠습니까?

Bash에서 초를 사람이 읽을 수 있는 시간으로 쉽게 형식화할 수 있습니까?

날짜 형식이 아닌 일/시간/분 등으로 형식을 지정하고 싶습니다.

답변1

다음과 같이 사용할 수 있습니다.

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

답변2

가장 간단하고 깨끗한 방법은 다음과 같습니다(여기서 GNU를 가정 date).

초 수가 다음과 같은 경우:

seconds=123456789 # as in one of the answers above

date -ud "@$seconds" +"$(( $seconds/3600/24 )) days %H hours %M minutes %S seconds"

--> 출력:1428 days 21 hours 33 minutes 09 seconds

답변3

신용은 간다스티븐 히메네즈그러나 누군가가 기간이 1분 미만인 경우 초만 표시하려는 경우 다음은 내가 사용하는 수정된 버전입니다(고정된 복수형도 사용).

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'
}

답변4

나는 Artie의 답변을 바탕으로 아이디어를 좋아합니다.

bash 내장 명령을 사용하면 이 작업을 수행할 수 있습니다 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

관련 정보