检查string是否是unix时间戳
我有一个string,我需要找出是否是一个unix时间戳,我怎么能有效地做到这一点?
我发现这个线程通过谷歌,但它没有拿出一个非常可靠的答案,恐怕。 (是的,我从上面提到的主题的原始海报中挑出了这个问题)。
好吧,经过一段时间的摆弄之后,我用date('U')
撤销解决scheme,并build议使用这个方法:
function isValidTimeStamp($timestamp) { return ((string) (int) $timestamp === $timestamp) && ($timestamp <= PHP_INT_MAX) && ($timestamp >= ~PHP_INT_MAX); }
如果给定的$timestamp
是一个string并且只包含数字和一个可选的减号字符,这个检查将只返回true。 数字也必须在整数的位范围内( 编辑 : 实际上不需要,如图所示 )。
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是为了确保你的string可以正确使用date
和类似的东西,例如它确保不会发生*:
echo date('Ym-d', '2147483648'); // 1901-12-13 echo date('Ym-d', '-2147483649'); // 2038-01-19
在64位系统上,整数当然大于这个数字,函数将不再为“2147483648”和“-2147483649”返回false,而是返回相应的较大数字。
(*) 注意:我不是100%确定,位范围对应于什么date可以使用
由于unix时间戳是一个整数,使用is_int() 。 然而,由于is_int
()对string不起作用,所以我们检查它是否是数字,它的内部forms是否与它的信号forms相同。 例:
( is_numeric($stamp) && (int)$stamp == $stamp )
我遇到了同样的问题,并为我自己创build了以下解决scheme,我不必乱用正则expression式或混乱的if-clause:
/** * @param string $string * @return bool */ public function isTimestamp($string) { try { new DateTime('@' . $string); } catch(Exception $e) { return false; } return true; }
这看起来像要走的路:
function is_timestamp($timestamp) { if(strtotime(date('dmY H:i:s',$timestamp)) === (int)$timestamp) { return $timestamp; } else return false; }
你也可以添加一个is_numeric()检查和其他各种检查。
但是这应该可以成为基础。
改进了@TD_Nijboer的答案。
如果提供的string不是时间戳,这将避免引发exception:
function isTimestamp($timestamp) { if(ctype_digit($timestamp) && strtotime(date('Ymd H:i:s',$timestamp)) === (int)$timestamp) { return true; } else { return false; }
你想检查一个string是否包含一个高数字?
is_numeric()是关键
或者将其转换为DateTime,并像预期的date范围一样进行一些检查。
这并没有考虑负面的时间(1970年以前),也没有考虑扩展范围(你可以使用64位整数,这样时间戳可以代表2038年以后的值)
$valid = ctype_digit($str) && $str <= 2147483647;
另一种可能性
$date_arg = time(); $date_is_ok = ($date_arg === strtotime(date('c', $date_arg)));
//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; } }
要么
if ($startDate < strtotime('-30 years') || $startDate > strtotime('+30 years')) { //throw exception }
如果你想用is_numeric()替代这个解决scheme,请考虑php本地函数为inputstring提供错误肯定,如“1.1”,“0123”,“0xFF”,这些inputstring不是时间戳格式。