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


71

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

我通过Google找到了该线程,但恐怕并没有一个非常可靠的答案。(是的,我在前面提到的帖子中抄写了原始海报上的问题)。


从阅读线程,我会说简短的答案是没有。您也许可以检查绝对无效但有效的东西,看起来像这样。
PurplePilot 2010年

您能否再添加一些解释,说明验证后为什么需要验证字符串或打算使用该字符串做什么。
戈登2010年

Answers:


100

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

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

如果给定的$timestamp字符串,并且仅由数字和可选的减号组成,则此检查将仅返回true 。该数字也必须在整数的位范围内(EDIT实际上不需要,如此处所示)。

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


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


1
认为否定时间戳是有效的。time_t至少在Linux中签名。
Yacoby

1
对于1276664400的值,它不起作用,可能是因为该值作为字符串(而不是整数)传递回了。
贾斯汀·约斯特

1
@jtyost它按照OP的解释和要求进行工作。它检查字符串是否是有效的Unix时间戳。传递整数显然不会返回true。传递"1276664400"意愿。
戈登

1
PHP的时间()似乎没有通过上述检查。php.net/manual/en/function.time.php
Allencode

2
@allencoded是,根据设计。time返回一个整数。OP要求检查字符串是否为unix时间戳
戈登

39

由于unix时间戳记是整数,请使用is_int()。但是,由于is_int()在字符串上不起作用,因此我们检查它是否为数字,并且其整数形式与原始形式相同。例:

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

为了表示以毫秒为单位的时间戳,unixtimestamp在某些区域也可能是浮点数,对吗?
Patrick Cornelissen 2010年

@Patrick由于浮点精度,Unix时间戳通常是整数。我从来没有遇到过它代表一个实数。
Yacoby 2010年

1
OP有一个字符串,所以is_int不会。如果有的话,必须是is_numeric。
戈登

@Gordon Yay对于PHP的不一致性。固定。
Yacoby

2
@SimaPro is_int('345345')返回FALSE,其中is_numeric('345345')返回TRUE。is_int()仅测试您传递的内容的类型,is_numeric()测试实际内容。
语法错误

16

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

/**
 * @param string $string
 * @return bool
 */
public function isTimestamp($string)
{
    try {
        new DateTime('@' . $string);
    } catch(Exception $e) {
        return false;
    }
    return true;
}

7

这看起来像是要走的路:

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

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


该代码有效,但是如果您传递的不是有效时间戳,则它将发出通知。
语法错误

关于什么的通知?(我有一个错字。使用dmY代替American mdY !!),您可以在Thing Throwing exceptions东西中对其进行修改。
TD_Nijboer 2014年

您传递了无效值,这是E_NOTICE。date()的格式不会对此造成影响。有些人不介意脚本抛出通知,而只是关闭该级别的错误报告,但是除非我们真的必须这样做,否则许多人(包括我自己)更愿意不抛出甚至使E_STRICT通知保持沉默。
语法错误

is_int($time) &&如果在内部添加将解决错误报告。为避免潜在的歧义'Y-m-d H:i:s',请按照文档使用格式(第3条注释)
PedroSanção2015年

1
在if语句内使用ctype_digit($ timestamp)&&代替is_int($ timestamp)。如果传入的$ timestamp为字符串形式,则Is_int将返回false。因此,传递is_int('123')将返回false。
Dimitar Darazhanski 2015年

6

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

3

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

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

1

您要检查字符串是否包含高数字?

is_numeric()是关键

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


0

另一种可能性:

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

2
您是否正在针对自己验证$ date_arg?如何验证另一个字符串是否是日期?
random_user_name 2012年

您不能相信PHP。因此,您需要两次检查所有内容:)
Emil Sabitov

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;
        }
    }

0

要么

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


0

在PHP中检查时间戳是否表示有效的格里高利日期,这对我来说很有效:

function checkdateTimestamp($timestamp) {
    return checkdate((int)date('m',$timestamp),(int)date('d',$timestamp),(int)date('Y',$timestamp));
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.