$ var是有效的unix时间戳

时间:2010-11-08 11:52:54

标签: php validation timestamp

我需要一个函数来验证变量的内容是否是有效的unix时间戳。

我已经检查了这个帖子:Check whether the string is a unix timestamp但问题是,投票最多的答案中的函数仍然会导致一些错误,例如:

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" 

这里,第一个应该是 TRUE ,第二个应该是 FALSE 所以,测试$var是否是真正有效的unix的最佳方法是什么时间戳?

5 个答案:

答案 0 :(得分:5)

  

这里,第一个应为TRUE,第二个应为FALSE

为什么呢? 20101108是一个有效的UNIX时间戳,如你所说,它是1970年8月21日。例如,很可能是一个人的生日。

实现目标的唯一方法是根据您使用的定义设置标记“理智”时间戳的日期范围 - 例如2000年1月1日之后的任何事情 - 并对此进行检查。

答案 1 :(得分:4)

解决方法是检查strtotime是否将字符串识别为有效的日期字符串。

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

这将清除可能是日期字符串而不是时间戳的字符串。编写代码比编写自己的健全性检查更容易。

答案 2 :(得分:4)

当时间戳大于整数大小时,可以使用正则表达式检查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);
}

答案 3 :(得分:0)

自己写;)

您可以查看的一些事项:

  • 给定参数是否为int?如果不是=&gt;假
  • 是负还是高于最高? =&GT;假
  • 其他一切都是真的

这适用于您的测试。

答案 4 :(得分:0)

任何数字都可能是时间戳。两个示例之间唯一的显着区别是后一种情况是字符串。在这种情况下:

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

is_numeric不好,因为对于可以解析为数字的字符串,它也会返回true。)