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


31

bash에서 사람이 읽을 수있는 시간으로 초를 쉽게 포맷 할 수 있습니까?

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


예 / 몇 가지 예를 제공해 주시겠습니까?
개브.

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 라미레즈

7

크레딧은 Stéphane Gimenez에 전달 되지만 누군가가 기간이 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'
}

이것은 정말 잘 작동했습니다. 나는 단순히 함수를 스크립트에 붙여 넣고 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

다음과 같이 위의 표시 시간 기능을 수정했습니다.

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
}

항상 0이더라도 HH : MM : SS를보고 싶기 때문입니다.


1

나는 아이디어로 좋아하는 atti의 답변을 기반으로하고 있습니다.

bash 내장 으로이 작업을 수행 할 수 있습니다 printf. 포크로 실행할 필요가 없습니다 date.

시간대는 printf현지 시간대의 시간을 형식화하므로 UTC로 설정해야 하며 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 는 bash-4.2-alpha로 시작 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 초입니다. date + FORMAT 옵션을 사용하여 형식을 지정할 수 있습니다.


7
그것은 질문이 요구 한 기간이 아니라 날짜입니다.
Gilles 'SO- 악의를 멈춰라'
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.