我有一个字符串,我需要知道它是否是一个unix时间戳,我怎么能有效地做到这一点?
我通过Google找到了this thread,但我不敢提出一个非常可靠的答案。 (是的,我在上述帖子的原始海报中提出了问题)。
答案 0 :(得分:90)
好的,在摆弄了一段时间之后,我撤回了date('U')
的解决方案,并建议改用此解决方案:
function isValidTimeStamp($timestamp)
{
return ((string) (int) $timestamp === $timestamp)
&& ($timestamp <= PHP_INT_MAX)
&& ($timestamp >= ~PHP_INT_MAX);
}
如果给定的$timestamp
是字符串,则此检查仅返回true,并且仅由数字和可选的减号组成。该数字也必须在整数的位范围内(编辑: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,但对于相应的较大数字。
(*)注意:我不是百分百确定,位范围对应的日期可以使用
答案 1 :(得分:37)
由于unix时间戳是整数,请使用is_int()。但是由于is_int
()对字符串不起作用,我们检查它是否为数字,并且其intergal形式与其orignal形式相同。例如:
( is_numeric($stamp) && (int)$stamp == $stamp )
答案 2 :(得分:11)
我遇到了同样的问题并为我自己创建了以下解决方案,我不必混淆正则表达式或凌乱的if-clauses:
/**
* @param string $string
* @return bool
*/
public function isTimestamp($string)
{
try {
new DateTime('@' . $string);
} catch(Exception $e) {
return false;
}
return true;
}
答案 3 :(得分:7)
这看起来像是要走的路:
function is_timestamp($timestamp) {
if(strtotime(date('d-m-Y H:i:s',$timestamp)) === (int)$timestamp) {
return $timestamp;
} else return false;
}
您还可以添加is_numeric()检查和所有其他检查 但这应该/可能是基础。
答案 4 :(得分:4)
改进了对@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;
}
答案 5 :(得分:3)
这不考虑负时间(1970年之前),也不考虑扩展范围(您可以使用64位整数,以便时间戳可以表示远在2038之后的值)
$valid = ctype_digit($str) && $str <= 2147483647;
答案 6 :(得分:1)
您想检查字符串是否包含较大的数字?
is_numeric()是键
或者将其转换为DateTime并对其进行一些检查,如预期的日期范围。
答案 7 :(得分:0)
另一种可能性:
$date_arg = time();
$date_is_ok = ($date_arg === strtotime(date('c', $date_arg)));
答案 8 :(得分: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;
}
}
答案 9 :(得分:0)
或
if ($startDate < strtotime('-30 years') || $startDate > strtotime('+30 years')) {
//throw exception
}
答案 10 :(得分:0)
如果您认为用this替换is_numeric()解决方案,请考虑php本机函数为输入字符串提供误报,例如&#34; 1.1&#34;,&#34; 0123& #34;,&#34; 0xFF&#34;它们不是时间戳格式。
答案 11 :(得分:0)
在PHP中检查时间戳是否代表有效的格里高利日期,这对我来说是有效的:
function checkdateTimestamp($timestamp) {
return checkdate((int)date('m',$timestamp),(int)date('d',$timestamp),(int)date('Y',$timestamp));
}
答案 12 :(得分: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