J'essaye d'écrire une fonction pour déterminer si une chaîne est une date/heure en utilisant PHP. Fondamentalement, une date/heure valide ressemblerait à ceci:
2012-06-14 01:46:28
Évidemment, même si ses valeurs sont complètement dynamiques, cela peut changer, mais il devrait toujours être sous la forme XXXX-XX-XX XX:XX:XX
, comment puis-je écrire une expression régulière pour vérifier ce modèle et renvoyer true s’il correspond.
Si c'est toute votre chaîne, essayez simplement de l'analyser:
if (DateTime::createFromFormat('Y-m-d H:i:s', $myString) !== FALSE) {
// it's a date
}
Voici une approche différente sans utiliser une expression régulière:
function check_your_datetime($x) {
return (date('Y-m-d H:i:s', strtotime($x)) == $x);
}
Si vous ne connaissez pas le format de date:
/**
* Check if the value is a valid date
*
* @param mixed $value
*
* @return boolean
*/
function isDate($value)
{
if (!$value) {
return false;
}
try {
new \DateTime($value);
return true;
} catch (\Exception $e) {
return false;
}
}
var_dump(isDate('2017-01-06')); // true
var_dump(isDate('2017-13-06')); // false
var_dump(isDate('2017-02-06T04:20:33')); // true
var_dump(isDate('2017/02/06')); // true
var_dump(isDate('3.6. 2017')); // true
var_dump(isDate(null)); // false
var_dump(isDate(true)); // false
var_dump(isDate(false)); // false
var_dump(isDate('')); // false
var_dump(isDate(45)); // false
J'utilise cette fonction en tant que paramètre de la fonction PHP filter_var
.
yyyy-mm-dd hh:mm:ss
function filter_mydate($s) {
if (preg_match('@^(\d\d\d\d)-(\d\d)-(\d\d) (\d\d):(\d\d):(\d\d)$@', $s, $m) == false) {
return false;
}
if (checkdate($m[2], $m[3], $m[1]) == false || $m[4] >= 24 || $m[5] >= 60 || $m[6] >= 60) {
return false;
}
return $s;
}
Une version plus petite, cela pourrait aider:
if(strtotime($date_string)){
// it's in date format
}
Bien que cela ait une réponse acceptée, cela ne fonctionnera pas efficacement dans tous les cas. Par exemple, je teste la validation de la date sur un champ de formulaire que j'ai avec la date "10/38/2013" et un objet DateObject valide a été renvoyé, mais la date correspond à ce que PHP appelle "débordé" de sorte 10/38/2013 "devient" 11/07/2013 ". Cela a du sens, mais devrions-nous simplement accepter la date modifiée ou obliger les utilisateurs à saisir la date correcte? Pour ceux d'entre nous qui sommes des nazis de validation de formulaire, nous pouvons utiliser ce correctif: https://stackoverflow.com/a/10120725/486863 et renvoyer juste false lorsque l'objet lève cet avertissement.
L'autre solution consiste à faire correspondre la date de chaîne à celle formatée et à comparer les deux pour une valeur égale. Cela semble tout aussi compliqué. Tant pis. Telle est la nature de PHP dev.
Je ne voudrais pas utiliser de regex pour cela, mais plutôt simplement scinder la chaîne et vérifier que la date est valide
list($year, $month, $day, $hour, $minute, $second) = preg_split('%( |-|:)%', $mydatestring);
if(!checkdate($month, $day, $year)) {
/* print error */
}
/* check $hour, $minute and $second etc */
strtotime
? Des listes? Expressions régulières?
Quel est le problème avec l'objet DateTime natif de PHP?
Dans mon projet, cela semble fonctionner:
function isDate($value) {
if (!$value) {
return false;
} else {
$date = date_parse($value);
if($date['error_count'] == 0 && $date['warning_count'] == 0){
return checkdate($date['month'], $date['day'], $date['year']);
} else {
return false;
}
}
}
Si vous êtes prêt à utiliser regEx, txt2re.com est toujours une bonne ressource:
<?php
$txt='2012-06-14 01:46:28';
$re1='((?:2|1)\\d{3}(?:-|\\/)(?:(?:0[1-9])|(?:1[0-2]))(?:-|\\/)(?:(?:0[1-9])|(?:[1-2][0-9])|(?:3[0-1]))(?:T|\\s)(?:(?:[0-1][0-9])|(?:2[0-3])):(?:[0-5][0-9]):(?:[0-5][0-9]))'; # Time Stamp 1
if ($c=preg_match_all ("/".$re1."/is", $txt, $matches))
{
$timestamp1=$matches[1][0];
print "($timestamp1) \n";
}
?>
Si vous avez PHP 5.2, la réponse de Joey ne fonctionnera pas. Vous devez étendre la classe DateTime de PHP:
class ExDateTime extends DateTime{
public static function createFromFormat($frmt,$time,$timezone=null){
$v = explode('.', phpversion());
if(!$timezone) $timezone = new DateTimeZone(date_default_timezone_get());
if(((int)$v[0]>=5&&(int)$v[1]>=2&&(int)$v[2]>17)){
return parent::createFromFormat($frmt,$time,$timezone);
}
return new DateTime(date($frmt, strtotime($time)), $timezone);
}
}
et que vous pouvez utiliser cette classe sans problèmes:
ExDateTime::createFromFormat('d.m.Y G:i',$timevar);
if (strtotime ($ date)> strtotime (0)) {echo 'c'est une date'}