У меня есть строка, и я должен узнать, является ли это меткой времени Unix или нет, как я могу сделать это эффективно?
Я нашел этот поток через Google, но он не придумывает очень основательный ответ, я боюсь. (И да, я запер вопрос из исходного плаката на вышеупомянутом потоке).
Хорошо, поигравшись с этим некоторое время, я забираю решение с датой ('U')
и предлагаю использовать это один:
function isValidTimeStamp($timestamp)
{
return ((string) (int) $timestamp === $timestamp)
&& ($timestamp <= PHP_INT_MAX)
&& ($timestamp >= ~PHP_INT_MAX);
}
Эта проверка вернет только истину, если заданная $ timestamp
является строкой и состоит исключительно из цифр и необязательного символа минуса. Число также должно находиться в диапазоне битов целого числа ( РЕДАКТИРОВАТЬ : фактически не требуется, как показано здесь ).
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 заключается в том, чтобы убедиться, что ваша строка может использоваться правильно до даты
и т.п., например он гарантирует, что этого не произойдет *:
echo date('Y-m-d', '2147483648'); // 1901-12-13
echo date('Y-m-d', '-2147483649'); // 2038-01-19
В 64-битных системах целое число, конечно, больше, и функция больше не будет возвращать false для «2147483648» и «-2147483649», но для соответствующих больших чисел.
(*) Примечание: я не уверен на 100%, битовый диапазон соответствует той дате, которую можно использовать, хотя
Вы хотите проверить, содержит ли строка большое число?
is_numeric () - это ключ
Или преобразуйте его в DateTime и выполните сверяется с ним как с ожидаемым диапазоном дат.
Это не учитывает отрицательное время (до 1970 года) и не учитывает расширенные диапазоны (вы можете использовать 64-битные целые числа, чтобы временная метка могла представлять значение далеко после 2038 года)
$valid = ctype_digit($str) && $str <= 2147483647;
Поскольку временная метка unix является целым числом, используйте is_int(). Однако, поскольку is_int
() не работает со строками, мы проверяем, является ли она числовой и совпадает ли ее интервальная форма с исходной. Пример:
( is_numeric($stamp) && (int)$stamp == $stamp )