我正在使用PHP中的值数组。其中一些值可能包含各种字符串格式的日期。
我需要将多种格式的日期转换为它们的数字等价物(Unix时间戳)。问题是能够确定字符串是否为日期。
使用
if (($timestamp = strtotime($str)) === false)
将检查字符串中的有效日期,但如何确定该值是否应该作为日期验证?
示例:
$x = {1,2,3,"4","11/12/2009","22/12/2000",true,false};
foreach($x as $value)
{
if(is_bool($value))
if(is_string($value))
if(is_numeric($value))
if(is_date($value)) ?
...
}
简而言之,是否有一种简单的方法可以检查字符串值是否为日期?
答案 0 :(得分:20)
简而言之,是否有一种简单的方法可以检查字符串值是否为日期?
不是真的,因为它可能是任意格式。
如果可能的话,我倾向于将解析留给strtotime()
的魔力。如果它设法创建一个有效的日期,那很好。如果没有,您将收到false
。
尽可能地为误报的可能性做好准备,因为strtotime()
甚至可以解析“上周五”之类的事情。
如果strtotime()
过于宽松,您可以考虑构建一个您想接受的日期格式集合,并使用每个日期的每种格式运行PHP 5.3 DateTime:createFromFormat
。
像(未经测试的)
$formats = array("d.m.Y", "d/m/Y", "Ymd"); // and so on.....
$dates = array(1,2,3,"4","11/12/2009","22/12/2000",true,false);
foreach ($dates as $input)
{
foreach ($formats as $format)
{
echo "Applying format $format on date $input...<br>";
$date = DateTime::createFromFormat($format, $input);
if ($date == false)
echo "Failed<br>";
else
echo "Success<br>";
}
}
答案 1 :(得分:13)
Pekka脚本的问题是'2011-30-30'的日期也被视为有效。这是修改后的版本。
$formats = array("d.m.Y", "d/m/Y", "Ymd"); // and so on.....
$dates = array(1,2,3,"4","11/12/2009","22/12/2000",true,false);
foreach ($dates as $input)
{
foreach ($formats as $format)
{
echo "Applying format $format on date $input...<br>";
$date = DateTime::createFromFormat($format, $input);
if ($date == false || !(date_format($date,$format) == $input) )
echo "Failed<br>";
else
echo "Success<br>";
}
}
答案 2 :(得分:1)
从http://au1.php.net/checkdate#113205推断; 只需将$ formats数组更改为您要检查的所有格式。
public function convertDate($value) {
$formats = ['M d, Y', 'Y-m-d'];
foreach($formats as $f) {
$d = DateTime::createFromFormat($f, $value);
$is_date = $d && $d->format($f) === $value;
if ( true == $is_date ) break;
}
return $is_date;
}