webentwicklung-frage-antwort-db.com.de

Prüfen Sie, ob die Zeichenfolge ein Unix-Zeitstempel ist

Ich habe eine Zeichenfolge und muss herausfinden, ob es sich um einen Unix-Zeitstempel handelt oder nicht. Wie kann ich das effektiv tun?

Ich habe diesen Thread über Google gefunden, aber ich finde keine sehr solide Antwort. (Und ja, ich habe die Frage aus dem Originalposter auf den oben genannten Thread geschrieben).

63
RHPT

Ok, nachdem ich einige Zeit damit herumgetüftelt habe, ziehe ich die Lösung mit date('U') zurück und schlage vor, diese zu verwenden:

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

Diese Prüfung gibt nur dann "true" zurück, wenn der angegebene $timestamp ein string ist und nur aus Ziffern und einem optionalen Minuszeichen besteht. Die Zahl muss auch innerhalb des Bitbereichs einer Ganzzahl liegen (EDIT: tatsächlich nicht benötigt, wie hier ).

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

Die Prüfung für PHP_INT_MAX besteht darin, sicherzustellen, dass Ihre Zeichenfolge von date und dergleichen korrekt verwendet werden kann, z. Es stellt sicher, dass dies nicht geschieht *:

echo date('Y-m-d', '2147483648');  // 1901-12-13
echo date('Y-m-d', '-2147483649'); // 2038-01-19

Auf 64-Bit-Systemen ist die ganze Zahl natürlich größer als diese und die Funktion gibt für "2147483648" und "-2147483649" nicht mehr "false" zurück, sondern für die entsprechenden größeren Zahlen.


(*) Hinweis: Ich bin nicht zu 100% sicher, der Bitbereich entspricht dem Datum, das verwendet werden kann.

89
Gordon

Da ein Unix-Zeitstempel eine Ganzzahl ist, verwenden Sie is_int () . Da is_int () jedoch nicht für Strings funktioniert, prüfen wir, ob es numerisch ist und dass seine Intergal-Form der ursprünglichen Form entspricht. Beispiel:

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

Ich bin auf dieselbe Frage gestoßen und habe die folgende Lösung für mich selbst erstellt, bei der ich mich nicht mit regulären Ausdrücken oder unordentlichen If-Klauseln herumschlagen muss:

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

so sieht der Weg aus:

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

sie können auch eine is_numeric () - Prüfung und alle anderen Prüfungen hinzufügen.
aber dies sollte/könnte die Grundlagen sein.

7
TD_Nijboer

Dies gilt nicht für negative Zeiten (vor 1970) oder für erweiterte Bereiche (Sie können 64-Bit-Ganzzahlen verwenden, sodass ein Zeitstempel einen Wert weit nach 2038 darstellen kann).

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

Verbesserte Antwort auf @TD_Nijboer.

Dadurch wird vermieden, dass eine Ausnahme ausgelöst wird, wenn der angegebene String kein Zeitstempel ist:

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

Sie möchten prüfen, ob eine Zeichenfolge eine hohe Nummer enthält?

is_numeric () ist der Schlüssel

Oder konvertieren Sie es in DateTime und prüfen Sie es wie einen erwarteten Datumsbereich.

1

Andere Möglichkeit:

$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

oder 

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

Wenn Sie denken, this solution durch is_numeric () zu ersetzen, beachten Sie bitte, dass die native php-Funktion falsch positive Werte für Eingabezeichenfolgen wie "1.1", "0123", "0xFF" liefert, die nicht im Zeitstempel sind Format.