$ var действительная метка времени Unix - PullRequest
4 голосов
/ 08 ноября 2010

Мне нужна функция для проверки, является ли содержимое переменной допустимой меткой времени Unix.

Я проверил эту тему: Проверьте, является ли строка меткой времени Unix , но проблема в том, что функция в ответе с наибольшим количеством голосов все еще может вызвать некоторые ошибки, например:

function is_timestamp($timestamp)
{
   return ((string) (int) $timestamp === $timestamp)
   && ($timestamp <= PHP_INT_MAX)
   && ($timestamp >= ~PHP_INT_MAX);
}

// Some tests:
$timestamp = 1289216307;
var_dump(is_timestamp($timestamp));
var_dump(date('Y-m-d', $timestamp));

// result
bool(false)
string(10) "2010-11-08" 

$timestamp = '20101108';
var_dump(is_timestamp($timestamp));
var_dump(date('Y-m-d', $timestamp));

// result
bool(true)
string(10) "1970-08-21" 

Здесь первое должно быть ИСТИНА , а второе должно быть ЛОЖЬ Итак, как лучше всего проверить, является ли $var действительно действительной меткой времени Unix?

Ответы [ 5 ]

5 голосов
/ 08 ноября 2010

Здесь первое должно быть ИСТИНА, а второе - ЛОЖЬ

Почему? 20101108 является действительной меткой времени UNIX, - как вы говорите, это 21 августа 1970 года. Вполне может быть, например, день рождения человека.

Единственный способ добиться того, чего вы хотите, - это установить диапазон дат, который помечает «нормальную» метку времени по определению, с которым вы работаете - например, что-нибудь после 1 января 2000 года - и сделайте проверку против этого.

4 голосов
/ 16 мая 2013

Вы можете проверить формат отметки времени Unix, используя регулярное выражение, когда отметка времени больше, чем размер целого числа:

/**
 * Check if timestamp is in unix format.
 * 
 * @param string $timestamp
 *   Target timestamp that will be checked.
 * 
 * @return bool
 *   TRUE if timestamp is in unix format. FALSE on failure.
 */
function is_unix_timestamp($timestamp) {
   return preg_match('/^\d+$/', $timestamp);
}
4 голосов
/ 08 ноября 2010

В качестве обходного пути для этого можно проверить, распознает ли strtotime строку как допустимую строку даты.

function is_timestamp($timestamp)
{
   return ((string) (int) $timestamp === $timestamp)
   && ($timestamp <= PHP_INT_MAX)
   && ($timestamp >= ~PHP_INT_MAX)
   && (!strtotime($timestamp));
}

Это отфильтровывает строки, которые, скорее всего, являются строками датычем отметки времени.Это, вероятно, проще, чем писать собственные проверки здравомыслия.

0 голосов
/ 08 ноября 2010

Любое число потенциально является меткой времени.Единственное существенное различие между вашими двумя примерами состоит в том, что последний случай является строкой.В этом случае:

function is_timestamp($timestamp) {
    return is_int($timestamp) || is_float($timestamp);
}

(is_numeric не годится, так как он также возвращает true для строк, которые можно анализировать как числа.)

0 голосов
/ 08 ноября 2010

Напишите свой собственный;)

Некоторые вещи, которые вы можете проверить:

  • Является ли данный параметр int?если нет => false
  • Это отрицательное значение или больше максимального?=> false
  • Все остальное верно

Это будет работать для ваших заданных тестов.

...