2010-11-08 90 views
4

我需要一个函数来验证变量的内容是否是一个有效的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

在链接的问题的任择议定书的要求是验证**字符串是否**是有效的时间戳。你的第一个例子传递一个** integer **,所以它显然会返回false。 – Gordon 2012-05-23 16:27:14

回答

4

在这里,第一要真实,第二应该是假的

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

要达到您想要的效果,唯一的方法是根据您使用的定义设置标记“理智”时间戳的日期范围。 2000年1月1日之后的任何事情 - 并对此进行检查。

+0

是的,你是对的,我已经看到了1970年,我认为它是错的,我的坏。 – mjsilva 2010-11-08 11:59:50

+0

@mjsilva我明白你的要求,但我认为你必须确保没有'yyyymmdd'类型的日期首先进入你的系统。没有可靠的方法来区分时间戳和日期字符串 – 2010-11-08 12:00:44

0

写你自己的;)

有些东西你可以检查:

  • 是给定参数的int?如果不是=>假
  • 它是否定的或大于最大值? =>假
  • 其他的一切是真实的

这会为您提供的测试工作。

+0

不行:OP想要将20101108识别为日期字符串,而不是时间戳 – 2010-11-08 11:59:58

+0

@Pekka:20101108是以字符串形式给出的,而不是int,因此它会根据请求返回'FALSE'。 – ZeissS 2010-11-08 12:05:05

0

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

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

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

4

针对此解决方法是检查是否strtotime识别字符串作为有效日期字符串。

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

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

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); 
} 
+1

亲爱的主,没有。没有必要使用正则表达式。 '返回ctype_digit($ timestamp)'似乎是一个逻辑/直接调用。 – mickmackusa 2017-12-07 14:06:41

+1

我同意,谢谢,我不知道这个功能。 – milkovsky 2017-12-07 14:38:15