どの時刻日付値が常に特定の時刻日付よりも大きいのですか?

どの時刻日付値が常に特定の時刻日付よりも大きいのですか?

どの時刻日付値が常に特定の時刻日付よりも大きいのですか?

スクリプトでは、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 7ffffffffffffffff)。

日付をテストして、システムの正確な制限を確認できます。

答え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

関連情報