检查字符串是不是为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) &&
可以解决报错问题。为了避免潜在的歧义,最好使用'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时间戳的主要内容,如果未能解决你的问题,请参考以下文章