какое значение timedate всегда больше любого timedate?

RHEL/CentOS намеревается отдавать приоритет стабильным версиям пакетов перед новыми версиями пакетов.Эта стратегия имеет неприятные последствия для PHP, поскольку последняя версия в репозитории — 5.4, , то есть EOL .

Обычной практикой является установка стороннего -репозитория для PHP, однако я бы рекомендовал Webtatic вместо Remi.

0
30.03.2021, 16:04
2 ответа

Нетрудно найти максимальное значение, допустимое для даты. В любом случае, это только 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, результат станет длиннее, чтобы объяснить (возможно год ограничения даты ).

$./script 55
end=67768036191691199 f0c2ab7c54e1bf

Тестирование printf (, уже определенного в скрипте, изменениеusedate)не дает ограничений на все до 63 бит (end=9223372036854775807 7ffffffffffffffff ).

Вы можете проверить свою дату, чтобы узнать точное ограничение в вашей системе.

1
28.04.2021, 22:54

Интересно, что в моей системе дата может иметь возраст более 2 миллиардов лет!:-)

Чтобы найти допустимые диапазоны, я написал этот небольшой скрипт:

#!/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
0
28.04.2021, 22:54

Теги

Похожие вопросы