76

我有一个字符串,我需要确定它是否是 unix 时间戳,我怎样才能有效地做到这一点?

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

4

13 回答 13

103

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

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

$timestamp如果给定的是字符串并且仅由数字和可选的减号组成,则此检查将仅返回 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 是为了确保您的字符串可以被其他人正确使用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% 确定,位范围与可以使用的日期相对应

于 2010-03-26T16:10:15.977 回答
40

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

( is_numeric($stamp) && (int)$stamp == $stamp )
于 2010-03-26T16:03:20.640 回答
19

我遇到了同样的问题并为我自己创建了以下解决方案,我不必弄乱正则表达式或凌乱的 if 子句:

/**
 * @param string $string
 * @return bool
 */
public function isTimestamp($string)
{
    try {
        new DateTime('@' . $string);
    } catch(Exception $e) {
        return false;
    }
    return true;
}
于 2016-03-15T11:51:39.680 回答
8

这看起来像要走的路:

function is_timestamp($timestamp) {
    if(strtotime(date('d-m-Y H:i:s',$timestamp)) === (int)$timestamp) {
        return $timestamp;
    } else return false;
}

您还可以添加 is_numeric() 检查和各种其他检查。
但这应该/可能是基础。

于 2013-05-22T13:50:14.873 回答
8

改进了对@TD_Nijboer 的回答。

如果提供的字符串不是时间戳,这将避免引发异常:

function isTimestamp($timestamp) {
    if(ctype_digit($timestamp) && strtotime(date('Y-m-d H:i:s',$timestamp)) === (int)$timestamp) {
        return true;
    } else {
        return false;
    }
}
于 2015-06-25T18:08:22.273 回答
4

这不考虑负时间(1970 年之前),也不考虑扩展范围(您可以使用 64 位整数,以便时间戳可以表示远在 2038 年之后的值)

$valid = ctype_digit($str) && $str <= 2147483647;
于 2010-03-26T16:32:24.050 回答
2

或者

if ($startDate < strtotime('-30 years') || $startDate > strtotime('+30 years')) {
    //throw exception
}
于 2014-05-20T11:48:00.600 回答
1

你想检查一个字符串是否包含一个高数字?

is_numeric() 是关键

或者将其转换为 DateTime 并对其进行一些检查,例如预期的日期范围。

于 2010-03-26T16:04:36.787 回答
1

如果您可能想用is_numeric()替换解决方案,请考虑 php 本机函数为输入字符串(如“1.1”、“0123”、“0xFF”)提供误报,这些字符串不是时间戳格式。

于 2015-06-03T03:32:01.957 回答
0
    //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;
        }
    }
于 2012-10-30T11:27:35.647 回答
0

另一种可能:

$date_arg = time();
$date_is_ok = ($date_arg === strtotime(date('c', $date_arg)));
于 2012-03-01T19:18:18.727 回答
0

在 PHP 中检查时间戳是否代表有效的公历日期,这对我有用:

function checkdateTimestamp($timestamp) {
    return checkdate((int)date('m',$timestamp),(int)date('d',$timestamp),(int)date('Y',$timestamp));
}
于 2020-11-18T01:27:06.840 回答
0

我从时间戳做两次检查,都是UTC,通常高于11/13位和控制后

// Is Timestamp control function
function isTimestamp($x,$lenMax = 11,$compare = 30){
if (!ctype_digit($x)) return false;
$x = strlen($x) >= $lenMax ? $x / 1000 : $x;
if ($x < strtotime("-{$compare} years") || $x > strtotime("+{$compare} years")) {   
    return false;
}
return true;

}

// Timestamp UTC usually take from javascript -> Date.Now() -> 1618362206593
echo check_timestamp(1618362206593); // Return -> true
// or that stand time()
echo check_timestamp(1618359229); // return -> true
// UTC
echo check_timestamp(5618362206593); // Return -> false
// or that stand time()
echo check_timestamp(5618359229); // return -> false
于 2021-04-14T02:00:38.420 回答