Проверьте, является ли строка меткой времени Unix - PullRequest
65 голосов
/ 26 марта 2010

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

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

Ответы [ 11 ]

91 голосов
/ 26 марта 2010

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

38 голосов
/ 26 марта 2010

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

( is_numeric($stamp) && (int)$stamp == $stamp )
11 голосов
/ 15 марта 2016

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

/**
 * @param string $string
 * @return bool
 */
public function isTimestamp($string)
{
    try {
        new DateTime('@' . $string);
    } catch(Exception $e) {
        return false;
    }
    return true;
}
7 голосов
/ 22 мая 2013

это похоже на путь:

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

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

4 голосов
/ 25 июня 2015

Улучшен ответ на @ 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;
}
3 голосов
/ 26 марта 2010

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

$valid = ctype_digit($str) && $str <= 2147483647;
1 голос
/ 26 марта 2010

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

is_numeric () является ключом

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

0 голосов
/ 03 июня 2015

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

0 голосов
/ 20 мая 2014

или

if ($startDate < strtotime('-30 years') || $startDate > strtotime('+30 years')) {
    //throw exception
}
0 голосов
/ 30 октября 2012
    //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;
        }
    }
...