web-dev-qa-db-ja.com

文字列がUNIXタイムスタンプかどうかを確認します

文字列があり、Unixタイムスタンプかどうかを調べる必要があります。どうすれば効果的に実行できますか?

私は このスレッド をGoogle経由で見つけましたが、非常に堅実な答えは出ていません。 (そして、はい、私は前述のスレッドの元のポスターからの質問を書き留めました)。

66
RHPT

OK、しばらくこれをいじった後、私はdate('U')で解決策を撤回し、代わりにこれを使用することを提案します:

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

このチェックは、指定された$timestampstringであり、数字とオプションのマイナス文字のみで構成されます。また、数値は整数のビット範囲内にある必要があります([〜#〜] 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を返さなくなりますが、対応する大き​​な数値に対してはfalseを返します。


(*)注:100%確信はありませんが、ビット範囲は使用できる日付に対応しています

92
Gordon

UNIXタイムスタンプは整数なので、 is_int() を使用します。ただし、is_int()は文字列では機能しません。数値であり、その形式間の形式が元の形式と同じかどうかを確認します。例:

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

私は同じ質問に出くわし、自分のために次のソリューションを作成しました。正規表現や乱雑なif句をいじる必要はありません。

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

これは行く方法のように見えます:

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

また、is_numeric()チェックとその他のあらゆる種類のチェックを追加できます。
しかし、これは基本的なはずです。

7
TD_Nijboer

@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

これは負の時間(1970年以前)を考慮せず、拡張範囲も考慮しません(タイムスタンプが2038年以降の値を表すことができるように64ビット整数を使用できます)

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

文字列に大きな数字が含まれているかどうかを確認したいですか?

is_numeric()がキーです

または、DateTimeに変換し、予想される日付範囲のように、いくつかのチェックを行います。

1

別の可能性:

$date_arg = time();
$date_is_ok = ($date_arg === strtotime(date('c', $date_arg)));
0
Chris
    //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
alex toader

または

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

this ソリューションを is_numeric() に置き換えると思う場合は、phpネイティブ関数が "1.1"、 "0123"、 "0xFFなどの入力文字列に対して誤検知を提供することを考慮してください。タイムスタンプ形式ではありません。