76

文字列があり、それがUNIXタイムスタンプであるかどうかを確認する必要がありますが、どうすればそれを効果的に行うことができますか?

私はグーグルでこのスレッドを見つけました、しかしそれは非常に確かな答えを思いつきません、私は恐れています。(そして、はい、私は前述のスレッドの元のポスターから質問をクリブしました)。

4

13 に答える 13

103

さて、しばらくこれをいじった後、私はソリューションを撤回し、date('U')代わりにこれを使用することを提案します:

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

このチェックは、指定され$timestamp文字列が数字とオプションのマイナス文字のみで構成されている場合にのみtrueを返します。数値も整数のビット範囲内にある必要があります(編集ここに示すように実際には不要です)。

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%確実ではありませんが、ビット範囲は使用できる日付に対応しています。

于 2010-03-26T16:10:15.977 に答える
40

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

( is_numeric($stamp) && (int)$stamp == $stamp )
于 2010-03-26T16:03:20.640 に答える
19

私は同じ質問に出くわし、自分自身のために次の解決策を作成しました。正規表現や厄介なif句をいじる必要はありません。

/**
 * @param string $string
 * @return bool
 */
public function isTimestamp($string)
{
    try {
        new DateTime('@' . $string);
    } catch(Exception $e) {
        return false;
    }
    return true;
}
于 2016-03-15T11:51:39.680 に答える
8

これは進むべき道のように見えます:

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

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

于 2013-05-22T13:50:14.873 に答える
8

@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;
    }
}
于 2015-06-25T18:08:22.273 に答える
4

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

$valid = ctype_digit($str) && $str <= 2147483647;
于 2010-03-26T16:32:24.050 に答える
2

また

if ($startDate < strtotime('-30 years') || $startDate > strtotime('+30 years')) {
    //throw exception
}
于 2014-05-20T11:48:00.600 に答える
1

文字列に高い数値が含まれているかどうかを確認しますか?

is_numeric()がキーです

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

于 2010-03-26T16:04:36.787 に答える
1

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

于 2015-06-03T03:32:01.957 に答える
0

別の可能性:

$date_arg = time();
$date_is_ok = ($date_arg === strtotime(date('c', $date_arg)));
于 2012-03-01T19:18:18.727 に答える
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;
        }
    }
于 2012-10-30T11:27:35.647 に答える
0

PHPでは、タイムスタンプが有効なグレゴリオ暦の日付を表しているかどうかを確認するために、これが機能しました。

function checkdateTimestamp($timestamp) {
    return checkdate((int)date('m',$timestamp),(int)date('d',$timestamp),(int)date('Y',$timestamp));
}
于 2020-11-18T01:27:06.840 に答える
0

タイムスタンプから2つのチェックを行います。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
于 2021-04-14T02:00:38.420 に答える