80 votes

Vérifier si la chaîne est un timestamp Unix

J'ai une chaîne et je dois savoir s'il s'agit ou non d'un horodatage Unix, comment puis-je le faire efficacement?

J'ai trouvé ce fil via Google, mais je ne crains pas qu'il apporte une réponse très solide. (Et oui, j'ai écrit la question de l'affiche originale sur le fil susmentionné).

106voto

Gordon Points 156415

Ok, après avoir jouer avec ce pour un certain temps, j'ai retirer la solution avec date('U') et suggèrent de l'utiliser à la place:

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

Cette case ne retourne true si l' $timestamp est une chaîne et se compose uniquement de chiffres et une option de moins de caractère. Le nombre doit aussi être dans les bits de large d'un entier (EDIT: en fait inutiles, comme illustré ici).

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

La case à cocher pour PHP_INT_MAX est de s'assurer que votre chaîne peut être utilisée correctement en date et les goûts, par exemple, il assure que cela n'arrive pas*:

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

Sur les systèmes 64 bits de l'entier est bien sûr plus que cela et la fonction ne renvoie plus faux pour les "2147483648" et "-2147483649" mais pour le correspondant plus grand nombre.


(*) Note: je ne suis pas sûr à 100%, les bits de large correspond à quelle date pouvez utiliser si

41voto

Yacoby Points 29771

Comme un horodatage Unix est un entier, utilisez is_int () . Cependant, comme is_int () ne fonctionne pas sur les chaînes, nous vérifions s'il est numérique et que sa forme intergale est la même que sa forme originale. Exemple:

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

9voto

TD_Nijboer Points 182

cela ressemble à la voie à suivre:

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

vous pouvez également ajouter une vérification is_numeric () et toutes sortes d'autres vérifications.
mais cela devrait / pourrait être la base.

4voto

goat Points 17643

Cela ne prend pas en compte les temps négatifs (avant 1970), ni les plages étendues (vous pouvez utiliser des entiers 64 bits pour qu'un horodatage puisse représenter une valeur bien après 2038).

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

1voto

Vous voulez vérifier si une chaîne contient un nombre élevé?

is_numeric () est la clé

Ou bien convertissez-le en DateTime et effectuez quelques vérifications avec elle comme une plage de dates prévue.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X