我有一些来自用户inpout和系统的各种字段。如果变量是日期,那么我不知道所有变量的上下文,也不是系统的预期日期格式。 如果用户回复某个字段'您何时需要它?由现在',我不希望将该值视为当前日期。
您是否有一种简单的方法可以检测日期是否为http://php.net/manual/en/datetime.formats.date.php
之类的有效日期但是不是 strtotime的有效字符串?
预期的测试集是:[$input, $expected]
:
[new \DateTime(), true],
[new \DateTimeImmutable(), true],
['2000-01-01', true],
['31/12/2000', true],
['01-01-1995', true],
['@1306123200', true],
['2010-04-25 02:24:16+12:00', true],
['12/31/2000', false],
['31/31/2000', false],
['now', false],
['next week', false],
[new \DateTimeZone('Europe/Paris'), false],
[false, false],
[0, false],
[true, false],
[1, false],
['1', false],
['1.1', false],
["", false],
[null, false],
[[], false],
[new \stdClass(), false],
["hi", false],
到目前为止,我通过检查单词进行检查:
foreach (['day', 'month', 'year', 'next', 'last', 'previous', 'this', 'ago', 'week', 'sun', 'mon', 'tue', 'wed', 'thu', 'fri', 'sat', 'now'] as $needle) {
$res = strpos($value, $needle);
if ($res !== false) {
return false;
}
}
然后尝试创建日期对象
try {
new \DateTime((string) $value);
return true;
} catch (\Exception $e) {
全功能:
public function isDate($value)
{
if ($value instanceof \DateTimeInterface) {
return true;
}
if ($value === false || $value === null || $value === '') {
return false;
}
if (is_numeric($value)) {
return false;
}
//protection for strtotime valid strings
if (is_string($value)) {
//1999-19-19 should pass
if (strpos($value, '-') && !preg_match('/[0-9]-[0-9]/', $value)) {
return false;
}
//2010-04-25 02:24:16+12:00 should pass
if (strpos($value, '+') && !preg_match('/[0-9]+[0-9]/', $value)) {
return false;
}
foreach (['day', 'month', 'year', 'next', 'last', 'previous', 'this', 'ago', 'week', 'sun', 'mon', 'tue', 'wed', 'thu', 'fri', 'sat', 'now'] as $needle) {
$res = strpos($value, $needle);
if ($res !== false) {
return false;
}
}
}
try {
new \DateTime((string) $value);
return true;
} catch (\Exception $e) {
}
return false;
}