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

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

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

【问题讨论】:

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

标签: php datetime time unix-timestamp


【解决方案1】:

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

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

仅当给定的$timestamp字符串 并且仅由数字和可选的减号组成时,此检查才会返回true。该数字还必须在整数的位范围内(EDITactually 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
                

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 2016-09-16
                  • 1970-01-01
                  • 1970-01-01
                  • 2017-07-29
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  相关资源
                  最近更新 更多