我需要一个函数来验证变量的内容是否是有效的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的最佳方法是什么时间戳?
答案 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)
自己写;)
您可以查看的一些事项:
这适用于您的测试。
答案 4 :(得分:0)
任何数字都可能是时间戳。两个示例之间唯一的显着区别是后一种情况是字符串。在这种情况下:
function is_timestamp($timestamp) {
return is_int($timestamp) || is_float($timestamp);
}
(is_numeric
不好,因为对于可以解析为数字的字符串,它也会返回true。)