Vérifier si la chaîne est un timestamp unix
J'ai un string et j'ai besoin de savoir si c'est un timestamp unix ou pas, comment puis-je le faire efficacement?
J'ai trouvé ce fil via Google, mais il n'est pas venu avec une très bonne réponse, je le crains. (Et oui, j'ai chipé la question de l'origine de l'affiche sur ledit fil).
- en lisant le fil, je dirais que la réponse courte est non. vous pourriez bien être en mesure de vérifier pour quelque chose qui n'est certainement pas valide, mais valide, ne ressemble pas à elle.
- Pouvez vous s'il vous plaît ajouter un peu plus d'explications pourquoi vous devez valider la chaîne ou ce que vous voulez faire avec elle, une fois qu'il est validé.
InformationsquelleAutor RHPT | 2010-03-26
Vous devez vous connecter pour publier un commentaire.
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:Cette case ne retourne true si la donnée
$timestamp
est un 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 (MODIFIER: en fait inutiles, comme illustré ici).Le vérifier PHP_INT_MAX est de s'assurer que votre chaîne peut être utilisée correctement par
date
et les goûts, par exemple, il assure que cela n'arrive pas*: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
time_t
est signé sous Linux au moins."1276664400"
volonté.time
renvoie un entier. L'OP a demandé à vérifier si le string est un timestamp unix.OR is_float($timestamp)) ? $timestamp : (string) (int) $timestamp;
?Comme un timestamp unix est un entier, l'utilisation is_int(). Cependant, comme
is_int
() ne fonctionne pas sur les cordes, on vérifie si elle est numérique et ses intergal forme est la même que sa forme originale. Exemple:Je suis tombé sur la même question et a créé la solution suivante pour moi, où je n'ai pas de gâchis avec des expressions régulières ou malpropre si-clauses:
cela ressemble à du chemin à faire:
vous pouvez également ajouter une is_numeric() vérifier et tous les autres types de contrôles.
mais cela devrait/pourrait être la base.
is_int($time) &&
à l'intérieur s'permettra de résoudre les rapports d'erreurs. Pour éviter une ambiguïté potentielle de mieux utiliser'Y-m-d H:i:s'
format par docs (3ème note)(is_int($timestamp) || ctype_digit($timestamp)) &&
au début de votre instruction if pour attraper la possibilité d'une chaîne de nombres ou un entier.Amélioration de la réponse à @TD_Nijboer.
Cela permettra d'éviter une exception est levée si la chaîne fournie n'est pas un horodatage:
Cela ne tient pas compte des effets négatifs de fois(avant 1970), ni ne compte pendant de longues plages(vous pouvez utiliser les entiers 64 bits ainsi qu'un horodatage peut représenter une valeur bien après 2038)
Vous voulez vérifier si une chaîne contient un nombre élevé?
is_numeric() est la clé de
Ou la convertir en type DateTime et faire quelques vérifications avec elle comme une date attendue de la gamme.
Une autre possibilité:
ou
Si vous pensez à remplacer cette solution avec is_numeric(), veuillez considérer que php natif de la fonction fournit de faux positifs pour les chaînes de caractères comme "1.1", "0123", "0xFF" qui ne sont pas dans le format d'horodatage.