用于检查字符串是否为日期的函数

Jus*_*tin 54 php regex validation datetime date

我正在尝试编写一个函数来确定字符串是否是使用PHP的日期/时间.基本上有效的日期/时间如下:

 2012-06-14 01:46:28
Run Code Online (Sandbox Code Playgroud)

显然虽然它的完全动态任何值都可以改变,但它应该总是以形式出现XXXX-XX-XX XX:XX:XX,如何编写正则表达式来检查这个模式,如果匹配则返回true.

Joe*_*oey 101

如果这是你的整个字符串,那么只需尝试解析它:

if (DateTime::createFromFormat('Y-m-d H:i:s', $myString) !== FALSE) {
  // it's a date
}
Run Code Online (Sandbox Code Playgroud)

  • 这不是解决方案.我有`DateTime :: createFromFormat('m/d/Y','10/38/2013')`并且它产生一个有效的DateTime对象而不是false.日期转换为`object(DateTime)#39(3){["date"] => string(19)"2013-11-07 23:45:55"["timezone_type"] => int(3) ["timezone"] => string(3)"UTC"}` (6认同)

Bjo*_*ern 35

这是一种不使用正则表达式的不同方法:

function check_your_datetime($x) {
    return (date('Y-m-d H:i:s', strtotime($x)) == $x);
}
Run Code Online (Sandbox Code Playgroud)


Joh*_*art 23

如果您不知道日期格式:

/**
 * 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
Run Code Online (Sandbox Code Playgroud)

  • var_dump(isDate("R")) = true。可能不是预期的那样。我认为它与时区或其他东西相匹配。 (3认同)
  • var_dump(isDate('现在')); //true var_dump(isDate('明天')); //true var_dump(isDate('昨天')); //真的 (2认同)
  • 当心整数!isDate('123456')== true和isDate(123456)== true (2认同)

Yog*_*try 11

一个较小的版本,可能会有所帮助:

if(strtotime($date_string)){
    // it's in date format
}
Run Code Online (Sandbox Code Playgroud)

  • 我不明白为什么这不会被接受的答案。这是 PHP 手册,明确指出如果不是日期字符串,则返回 FALSE:https://www.php.net/manual/en/function.strtotime.php (7认同)
  • 这是迄今为止我见过的最好的、优雅的、简单的、有效的方法。谢谢约格什·米斯特里 (6认同)
  • `strtotime("2021-02-31 08:00:00")` 将返回 `int(1614787200)` ,其计算结果为 `TRUE` 但它不是 OP 要求的有效日期时间字符串 (6认同)
  • 不适用于 `strtotime('a string');` -> 返回当前时间。 (5认同)
  • 给出错误的结果是字符串以“+”开头 (2认同)

小智 8

在我的项目中,这似乎有效:

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;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 效果很好。需要一种方法来决定我是否要尝试解析日期,或者只是将其显示为纯文本。效果很好。 (2认同)
  • 验证任何日期的最佳解决方案。谢谢! (2认同)

Sal*_*n A 5

我将此函数用作PHP filter_var函数的参数。

  • 它检查yyyy-mm-dd hh:mm:ss格式的日期
  • 它拒绝匹配模式但仍然无效的日期(例如4月31日)

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;
}
Run Code Online (Sandbox Code Playgroud)

  • ^(\ d {4}(?:\-\ d {2}){2} \ d {2}(?:\:\ d {2}){2})$ (5认同)