Проверьте, является ли строка меткой времени Unix

У меня есть строка, и я должен узнать, является ли это меткой времени Unix или нет, как я могу сделать это эффективно?

Я нашел этот поток через Google, но он не придумывает очень основательный ответ, я боюсь. (И да, я запер вопрос из исходного плаката на вышеупомянутом потоке).

67
задан hakre 6 July 2012 в 09:51
поделиться

4 ответа

Хорошо, поигравшись с этим некоторое время, я забираю решение с датой ('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%, битовый диапазон соответствует той дате, которую можно использовать, хотя

93
ответ дан 24 November 2019 в 14:31
поделиться

Вы хотите проверить, содержит ли строка большое число?

is_numeric () - это ключ

Или преобразуйте его в DateTime и выполните сверяется с ним как с ожидаемым диапазоном дат.

1
ответ дан 24 November 2019 в 14:31
поделиться

Это не учитывает отрицательное время (до 1970 года) и не учитывает расширенные диапазоны (вы можете использовать 64-битные целые числа, чтобы временная метка могла представлять значение далеко после 2038 года)

$valid = ctype_digit($str) && $str <= 2147483647;
3
ответ дан 24 November 2019 в 14:31
поделиться

Поскольку временная метка unix является целым числом, используйте is_int(). Однако, поскольку is_int() не работает со строками, мы проверяем, является ли она числовой и совпадает ли ее интервальная форма с исходной. Пример:

( is_numeric($stamp) && (int)$stamp == $stamp )
38
ответ дан 24 November 2019 в 14:31
поделиться
Другие вопросы по тегам:

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