1. ホーム
  2. php

文字列がunixタイムスタンプであるかどうかを確認する

2023-10-31 11:25:23

質問

文字列があり、それが unix タイムスタンプであるかどうかを調べる必要があります。

私は見つけた このスレッド を Google 経由で見つけましたが、残念ながらあまり確かな答えは出てきません。(そして、はい、私は前述のスレッドのオリジナル投稿者から質問をパクりました)。

どのように解決するのですか?

さて、しばらくいじった後、私は解決策を撤回しました。 date('U') を使った解決策を撤回し、代わりにこれを使うことを提案します。

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

このチェックは、与えられた $timestamp 文字列 で、数字とオプションのマイナス文字のみで構成されています。また、数値は整数のビット範囲内である必要があります ( 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%確実ではありませんが、ビット範囲は日付が使用できるものに対応しています。