어떤 시간 날짜 값이 항상 특정 시간 날짜보다 큰가요?

어떤 시간 날짜 값이 항상 특정 시간 날짜보다 큰가요?

어떤 시간 날짜 값이 항상 특정 시간 날짜보다 큰가요?

스크립트에서는 duration프로세스를 종료할 때까지 루프가 영원히 실행되도록 변수에 매개변수를 제공하고 싶습니다.

# `duration` has a value in seconds
end=$(($(date +%s) + duration))  

while true; do
    # ...
    [ $(date +%s) -ge $end ] && break
    # ...
done

답변1

나는 그것을 다음과 같이 바꿀 것입니다 :

SECONDS=0

while true; do
    # ...
    [ "$duration" = forever ] || [ "$SECONDS" -lt "$duration" ] || break
    # ...
done

그리고 시스템이 지원하는 최대 개수가 얼마인지 duration=forever걱정할 필요가 없습니다 .[

$SECONDS매초마다 자동으로 증가합니다. 이 기능은 ksh에서 제공되며 zsh및 에서도 사용할 수 있습니다 bash. 그러나 벽시계 시간의 전체 초 수가 변경될 때마다 $SECONDSin이 증가합니다. 예를 들어 12:00:00.999에 실행하면 12:00:01.000에 1로 증가합니다. 밀리초 후에.bashSECONDS=0

다음으로 전환할 수 있는 옵션이 있는 경우 zsh(더 이상 해당 오류가 발생하지 않음) 다음과 같이 변경할 수 있습니다.

typeset -F SECONDS=0
while true; do
    # ...
    (( SECONDS < duration )) || break
    # ...
done

그리고 duration=inf영원히 실행하려면 for 루프를 사용하세요. 이는 또한 부분적인 기간을 허용합니다.

답변2

스티븐의 방법더 좋지만 도달할 수 없는 숫자와 실제로 비교하고 싶다면 다음을 지정할 수 있습니다.배쉬의 최대치현재 Linux 시스템(32비트 및 64비트)을 비교하면 다음과 같습니다.

end=9223372036854775807

date현재 버전의 GNU는 연도를 1900 + (2 31 - 1)로 제한하기 때문에 해당 값에 도달할 수 없습니다 . 따라서 최대 결과 date +%s는 67768036191719999(12월 31일, 2147485547 23:59:59 UTC-12)입니다.

답변3

날짜가 유효한 최대값을 찾는 것은 어렵지 않습니다. 어쨌든 테스트에는 64비트만 사용할 수 있습니다.

#!/bin/bash

start=${1:-50}
maxint=$(( (1<<63)-1 ))
usedate="date"

for ((n=start;n>=0;n--)); do
    limit=$((1<<n))
    if [[ $limit -lt 0 ]] || [[ $limit -gt $maxint ]] ; then limit=$maxint; fi

    if [[ $usedate == "date" ]]; then
    if endtime=$(date -d @"$((end | limit))" +'<<%s>>'); then
        enderror=""
    else
        enderror="error reported"
    fi
    else
    enderror=$( printf -v endtime '%(%s)T' "$((end | limit))" >/dev/null);
    fi
    
    if [ -z "$enderror" ]; then 
    end=$((end | limit))
    fi
    printf "end=%d %x\n" "$end" "$end"

done

비트 54까지는 제한이 괜찮아 보이며 결과는 다음과 같습니다.

$ ./script 54
end=36028797018963967 7fffffffffffff

그러나 일단 55를 시도하면 결과를 해석하는 데 더 오랜 시간이 걸리기 시작합니다(아마도 1년 날짜 제한일 수 있음).

$ ./script 55
end=67768036191691199 f0c2ab7c54e1bf

printf 테스트(change 스크립트에 이미 정의되어 있음 usedate)는 최대 63비트 제한을 제공하지 않습니다(end=9223372036854775807 7ffffffffffffff).

날짜를 테스트하여 시스템의 정확한 한도를 확인할 수 있습니다.

답변4

흥미롭게도 내 시스템에서는 날짜가 20억년 전으로 거슬러 올라갑니다! :-)

유효한 범위를 찾기 위해 다음과 같은 작은 스크립트를 작성했습니다.

#!/bin/bash
printdate () { TZ=UTC0 date -d@$1 ;}
limits () { # GOOD BAD
  local good=$1 bad=$2 mid
  while (( ( good > bad ? good - bad : bad - good ) >1 )) ;do
    (( mid = (good - bad) / 2  + bad )) # "(good+bad)/2" could overflow 
    printdate $mid >/dev/null 2>&1 && good=$mid || bad=$mid
  done
echo $good
printdate $good
}

((MAX=(1<<63)-1))
limits 0 $MAX
limits 0 -$MAX
Results:

# limits 0 $MAX
67768036191676799
Wed Dec 31 23:59:59 UTC 2147485547

# limits 0 -$MAX
-67768040609740800
Thu Jan  1 00:00:00 UTC -2147481748

관련 정보