Ладно, поигравшись с этим в течение некоторого времени, я забираю решение с date('U')
и предлагаю использовать это вместо:
function isValidTimeStamp($timestamp)
{
return ((string) (int) $timestamp === $timestamp)
&& ($timestamp <= PHP_INT_MAX)
&& ($timestamp >= ~PHP_INT_MAX);
}
Эта проверка вернет true, только если данное $timestamp
является строкой и состоит только из цифр и необязательного минуса. Число также должно быть в диапазоне битов целого числа ( EDIT : фактически не требуется, как показано здесь ).
var_dump( isValidTimeStamp(1) ); // false
var_dump( isValidTimeStamp('1') ); // TRUE
var_dump( isValidTimeStamp('1.0') ); // false
var_dump( isValidTimeStamp('1.1') ); // false
var_dump( isValidTimeStamp('0xFF') ); // false
var_dump( isValidTimeStamp('0123') ); // false
var_dump( isValidTimeStamp('01090') ); // false
var_dump( isValidTimeStamp('-1000000') ); // TRUE
var_dump( isValidTimeStamp('+1000000') ); // false
var_dump( isValidTimeStamp('2147483648') ); // false
var_dump( isValidTimeStamp('-2147483649') ); // false
Проверка для PHP_INT_MAX состоит в том, чтобы убедиться, что ваша строка может правильно использоваться date
и лайками, например, это гарантирует, что этого не произойдет *:
echo date('Y-m-d', '2147483648'); // 1901-12-13
echo date('Y-m-d', '-2147483649'); // 2038-01-19
В 64-битных системах целое число, конечно, больше этого значения, и функция больше не будет возвращать false для «2147483648» и «-2147483649», но для соответствующих больших чисел.
(*) Примечание: я не уверен на 100%, битовый диапазон соответствует дате, которую можно использовать, хотя