У меня есть строка, и мне нужно выяснить, является ли она временной отметкой 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», которые не находятся в формате временной шкалы.