Intereting Posts
Как я могу объединить 3 изображения в 1 изображение через PHP? PHPExcel – форматирование теряется при редактировании кода Как проанализировать сериализованную структуру данных PHP на Java? Успех: 1 все еще нет уведомления в android Как я могу сделать сегментный маршрутизатор безопасным процессом ограничений в ZF2? Отключите другие флажки, если два из них выбраны с помощью jquery Как выбрать язык пользователя Разрешение использования пользовательских доменных имен для проектов веб-приложений Как автоматически начать загрузку в PHP? Справка по объекту PropertyObject mysqli – вызов ошибки fetch_Array для функции-члена fetch_array () для не-объекта mysqli Как подделать переменную $ _SERVER ? PhantomJS – «небезопасно-eval» не является разрешенным источником сценария в следующей директиве политики безопасности контента Как правильно включить расширение песочницы twig в Symfony2? Моделирование много-ко-многим с несколькими типами объектов в Kohana w / ORM

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

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

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

Хорошо, после того, как я некоторое время проделывал это, я снимаю решение с 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('Ym-d', '2147483648'); // 1901-12-13 echo date('Ym-d', '-2147483649'); // 2038-01-19 

В 64-битных системах целое число конечно больше этого, и функция больше не будет возвращать false для «2147483648» и «-2147483649», но для соответствующих больших чисел.


(*) Примечание: я не уверен на 100%, диапазон бит соответствует тому, что может использовать дата

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

 $date_arg = time(); $date_is_ok = ($date_arg === strtotime(date('c', $date_arg))); 
  //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; } } 

или

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

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