检查字符串是否为 Unix 时间戳

2022-08-30 08:21:41

我有一个字符串,我需要找出它是否是Unix时间戳,我该如何有效地做到这一点?

我通过Google找到了这个帖子,但恐怕它没有得出一个非常可靠的答案。(是的,我在上述线程上从原始海报中抄写了这个问题)。


答案 1

好吧,在摆弄了一段时间之后,我撤回了解决方案,并建议改用这个解决方案:date('U')

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

仅当给定的是字符串并且仅由数字和可选的减号字符组成时,此检查才会返回 true。该数字还必须在整数的位范围内(编辑实际上不需要,如下所示)。$timestamp

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,而是为相应的较大数字返回false。


(*) 注意:我不是100%确定,位范围对应于可以使用的日期


答案 2

由于 unix 时间戳是整数,请使用 is_int())。然而,由于()不适用于字符串,我们检查它是否是数字,并且它的intergal形式与其原始形式相同。例:is_int

( is_numeric($stamp) && (int)$stamp == $stamp )

推荐