检查字符串是不是为unix时间戳

Posted

技术标签:

【中文标题】检查字符串是不是为unix时间戳【英文标题】:Check whether the string is a unix timestamp检查字符串是否为unix时间戳 【发布时间】:2011-02-01 06:04:36 【问题描述】:

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

我通过 Google 找到了this thread,但恐怕它并没有给出非常可靠的答案。 (是的,我在上述线程上抄袭了原始海报中的问题)。

【问题讨论】:

从阅读线程我会说简短的答案是否定的。您很可能能够检查绝对无效但有效但看起来不像的东西。 能否请您添加更多解释,说明您需要验证字符串的原因或您打算在验证后如何处理它。 【参考方案1】:

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

function isValidTimeStamp($timestamp)

    return ((string) (int) $timestamp === $timestamp) 
        && ($timestamp <= php_INT_MAX)
        && ($timestamp >= ~PHP_INT_MAX);

仅当给定的$timestamp字符串 并且仅由数字和可选的减号组成时,此检查才会返回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,而是为相应的较大数字返回 false。


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

【讨论】:

认为负时间戳是有效的。 time_t 至少在 Linux 中签名。 它不适用于值 1276664400,可能是因为该值作为字符串而不是整数传回。 @jtyost 它按照 OP 的解释和要求工作。它检查 string 是否是有效的 Unix 时间戳。传入一个 integer 显然不会返回 true。传入"1276664400" 将。 php time() 似乎没有通过上面的检查。 php.net/manual/en/function.time.php @allencoded 是的,设计使然。 time 返回一个整数。 OP 要求检查 string 是否为 unix 时间戳【参考方案2】:

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

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

【讨论】:

用毫秒来表示时间戳,unixtimestamp在某些地方也可能是浮点数吧? @Patrick 由于浮点精度,Unix 时间戳通常是整数。我从来没有遇到过它表示为一个实数。 OP 有一个字符串,所以 is_int 不会。如果有的话,必须是 is_numeric。 @Gordon Yay 为 PHP 的反复无常。固定。 @SimaPro is_int('345345') 返回 FALSE,其中 is_numeric('345345') 返回 TRUE。 is_int() 只测试你传递的任何类型,is_numeric() 测试实际内容。【参考方案3】:

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

/**
 * @param string $string
 * @return bool
 */
public function isTimestamp($string)

    try 
        new DateTime('@' . $string);
     catch(Exception $e) 
        return false;
    
    return true;

【讨论】:

【参考方案4】:

这看起来像要走的路:

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

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

【讨论】:

此代码有效,但如果您传递的不是有效时间戳,它会发出通知。 关于than的通知是什么? (我有一个错字。使用 d-m-Y 而不是美国的 m-d-Y !!)你可以修改它 Throwing exceptions en stuff。 这是一个 E_NOTICE,您传递了一个无效值。 date() 的格式不影响这一点。有些人不介意脚本抛出通知,只是关闭该级别的错误报告,但许多人(包括我自己)宁愿不抛出或沉默 E_STRICT 通知,除非我们真的必须这样做。 在 if 中添加is_int($time) &amp;&amp; 可以解决报错问题。为了避免潜在的歧义,最好使用'Y-m-d H:i:s' 格式为per docs(第三注) 在 if 语句中使用 ctype_digit($timestamp) && 而不是 is_int($timestamp)。如果传入的 $timestamp 是字符串形式,Is_int 将返回 false。因此,传递 is_int('123') 将返回 false。【参考方案5】:

改进了对@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;
    

【讨论】:

多年来一直使用这个,但意识到它不适用于夏令时 (DST) 和某些时区。例如1635638410 & Europe/Paris 时区将返回 false。【参考方案6】:

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

$valid = ctype_digit($str) && $str <= 2147483647;

【讨论】:

【参考方案7】:

if ($startDate < strtotime('-30 years') || $startDate > strtotime('+30 years')) 
    //throw exception

【讨论】:

【参考方案8】:

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

is_numeric() 是关键

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

【讨论】:

【参考方案9】:

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

【讨论】:

【参考方案10】:

另一种可能性:

$date_arg = time();
$date_is_ok = ($date_arg === strtotime(date('c', $date_arg)));

【讨论】:

您正在验证 $date_arg 对自己?这如何验证另一个字符串是否是日期? 你不能信任 PHP。所以你需要检查两次:)【参考方案11】:
    //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;
        
    

【讨论】:

【参考方案12】:

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

function checkdateTimestamp($timestamp) 
    return checkdate((int)date('m',$timestamp),(int)date('d',$timestamp),(int)date('Y',$timestamp));

【讨论】:

【参考方案13】:

我从 timestamp 进行两次检查,都是 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

【讨论】:

以上是关于检查字符串是不是为unix时间戳的主要内容,如果未能解决你的问题,请参考以下文章

将带时区的字符串转换为 unix 时间戳

Hive/SparkSQL:如何将 Unix 时间戳转换为时间戳(不是字符串)?

C语言应用——Unix时间戳和北京时间的相互转换

将 Unix 时间戳转换为日期字符串

MySQL将日期字符串转换为Unix时间戳

将长的 Unix 纪元时间戳转换为实际日期/时间