正确确定日期字符串是否是该格式的有效日期

新手上路,请多包涵

我从 API 接收日期字符串,其格式为 yyyy-mm-dd

我目前正在使用正则表达式来验证字符串格式,这可以正常工作,但我可以看到一些情况,根据字符串,它可能是正确的格式,但实际上是无效的日期。即 2013-13-01 例如。

在 PHP 中是否有更好的方法来获取字符串,例如 2013-13-01 并判断它是否是格式 yyyy-mm-dd 的有效日期?

原文由 Marty Wallace 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 731
2 个回答

为此,您可以使用 DateTime::createFromFormat()

 function validateDate($date, $format = 'Y-m-d')
{
    $d = DateTime::createFromFormat($format, $date);
    // The Y ( 4 digits year ) returns TRUE for any integer with any number of digits so changing the comparison from == to === fixes the issue.
    return $d && $d->format($format) === $date;
}

[ 取自 这个答案 的功能。也在 php.net 上。最初由 Glavić 编写。 ]


测试用例:

 var_dump(validateDate('2013-13-01'));  // false
var_dump(validateDate('20132-13-01')); // false
var_dump(validateDate('2013-11-32'));  // false
var_dump(validateDate('2012-2-25'));   // false
var_dump(validateDate('2013-12-01'));  // true
var_dump(validateDate('1970-12-01'));  // true
var_dump(validateDate('2012-02-29'));  // true
var_dump(validateDate('2012', 'Y'));   // true
var_dump(validateDate('12012', 'Y'));  // false

演示!

原文由 Amal Murali 发布,翻译遵循 CC BY-SA 4.0 许可协议

尝试这个:

 $myday = '2022-1-30';
if (($timestamp = strtotime($myday)) === false) {
    echo 'The string ('.$myday.') is not date';
} else {
    echo 'The string ('.$myday.') is date = ' . date('l dS \o\f F Y h:i:s A', $timestamp);
}

原文由 Stieranka 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题