我有一个字符串,我需要找出它是否是unix时间戳,如何有效地做到这一点?
我通过谷歌找到了this thread个,但恐怕没有一个非常可靠的答案.(是的,我在前面提到的帖子上抄袭了原始海报上的问题).
我有一个字符串,我需要找出它是否是unix时间戳,如何有效地做到这一点?
我通过谷歌找到了this thread个,但恐怕没有一个非常可靠的答案.(是的,我在前面提到的帖子上抄袭了原始海报上的问题).
好的,在摆弄了一段时间之后,我撤回了date('U')
的解决方案,并建议改用这个解决方案:
function isValidTimeStamp($timestamp)
{
return ((string) (int) $timestamp === $timestamp)
&& ($timestamp <= PHP_INT_MAX)
&& ($timestamp >= ~PHP_INT_MAX);
}
仅当给定的$timestamp
是string且仅由数字和可选减号组成时,此判断才会返回true.数字还必须在整数(EDIT:actually unneeded as shown here)的位范围内.
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的判断是为了确保字符串可以被date
等正确使用,例如,它确保不会发生这种情况*:
echo date('Y-m-d', '2147483648'); // 1901-12-13
echo date('Y-m-d', '-2147483649'); // 2038-01-19
在64位系统上,整数当然大于该值,对于"2147483648"和"-2147483649",函数将不再返回false,而是返回相应的较大数字.
(*)Note: I'm not 100% sure, the bit range corresponds with what date can use though