Dize bir unix zaman damgası olup olmadığını kontrol edin

6 Cevap php

Ben bir dize var ve ben bunu bir Unix zaman damgası olup olmadığını öğrenmek gerekiyor, bunu nasıl etkili yapabilirsiniz?

Korkarım, Google üzerinden this thread buldum, ama çok sağlam bir cevap gelmiyor. (Ve evet, ben yukarıda belirtilen parçacığı üzerinde orijinal afişten soruyu cribbed).

6 Cevap

Tamam, bir süre için bu işe yaramaz sonra, ben date('U') ile çözüm çekilme ve yerine bunu kullanmanızı öneririm:

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

Bu kontrol tek gerçek dönecektir eğer $timestamp bir string ve sadece basamak ve isteğe bağlı eksi karakteri oluşur verilmedi. Sayı, aynı zamanda, bir tamsayı bit aralığı içinde olmak zorundadır (EDIT, 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'tan için onay sizin dize date tarafından doğru kullanılabilir olması sağlamak ve seviyor, örneğin Bu * olmaz sağlar:

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

(*) Note: I'm not 100% sure, the bit range corresponds with what date can use though

Bir unix timestamp bir tamsayı olarak kullanmak is_int(). is_int () dizeleri çalışmıyor gibi sayısal ve onun intergal formu kendi orignal form olarak aynı Ancak, biz kontrol. Örnek:

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

Bir dize sayısının yüksek olup olmadığını kontrol etmek istiyorsun?

is_numeric () anahtar

Ya da DateTime dönüştürmek ve beklenen bir tarih aralığı gibi onunla bazı kontrolleri yapmak.

Bu (1970 öncesi) negatif kez hesap değil, ne de (bir zaman damgası kadar 2038 sonrasında bir değeri temsil edebilir böylece 64 bit tamsayılar kullanabilirsiniz) uzun aralıklar için hesap yok

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

Bir başka olasılık:

$date_arg = time();
$date_is_ok = ($date_arg === strtotime(date('c', $date_arg)));

(henüz) test edilmiş, ancak bu gitmek için yol gibi görünüyor değil:

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

you could also add a is_numeric() check and all sort of other checks.
but this should/could be the basics.