У меня есть строка, и мне нужно выяснить, является ли она временной отметкой unix или нет, как я могу сделать это эффективно?
Я нашел эту тему через Google, но, похоже, это не очень надежный ответ. (И да, я обрезал вопрос с оригинального плаката по вышеупомянутой теме).
Ответ 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", которые не находятся в формате временной шкалы.