Подтвердить что ты не робот

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

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

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

4b9b3361

Ответ 1

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

Ответ 2

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

( is_numeric($stamp) && (int)$stamp == $stamp )

Ответ 3

Я столкнулся с одним и тем же вопросом и создал следующее решение для себя, где мне не нужно возиться с регулярными выражениями или беспорядочными if-предложениями:

/**
 * @param string $string
 * @return bool
 */
public function isTimestamp($string)
{
    try {
        new DateTime('@' . $string);
    } catch(Exception $e) {
        return false;
    }
    return true;
}

Ответ 4

это выглядит как способ:

function is_timestamp($timestamp) {
    if(strtotime(date('d-m-Y H:i:s',$timestamp)) === (int)$timestamp) {
        return $timestamp;
    } else return false;
}

вы также можете добавить проверку is_numeric() и все другие проверки.
но это должно быть/может быть основами.

Ответ 5

Улучшен ответ на @TD_Nijboer.

Это позволит исключить исключение, если поставляемая строка не является меткой времени:

function isTimestamp($timestamp) {
    if(ctype_digit($timestamp) && strtotime(date('Y-m-d H:i:s',$timestamp)) === (int)$timestamp) {
        return true;
    } else {
        return false;
}

Ответ 6

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

is_numeric() - это ключ

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

Ответ 7

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

$valid = ctype_digit($str) && $str <= 2147483647;

Ответ 8

Другая возможность:

$date_arg = time();
$date_is_ok = ($date_arg === strtotime(date('c', $date_arg)));

Ответ 9

    //if anything else than digits inside the string then your string is no timestamp 
    //in which case maybe try to get the timestamp with strtotime

    if(preg_match('/[^\d]/', $str)) {
        $str = strtotime($str);

        if (false === $str) {
            //conversion failed - invalid time - invalid row
            return;
        }
    }

Ответ 10

или

if ($startDate < strtotime('-30 years') || $startDate > strtotime('+30 years')) {
    //throw exception
}

Ответ 11

Если вы можете подумать о замене этого решения с is_numeric(), учтите, что родная функция php предоставляет ложные срабатывания для входных строк типа "1.1", "0123", "0xFF", которые не находятся в формате временной шкалы.