我的函数之一是$date
变量。
有时日期有时间(如2018-01-01 15:40:43
),
有时候 - 没有(比如2018-01-01
)。
我想知道时间是否已经确定。 最简单的方法是什么?
这是我试过的:
function checkDate ($date) {
$time = date("H:i:s", strtotime($date));
if ($time == '00:00:00') {
//time was not set!
}
}
显然,这有效,但直到2018-06-01 00:00:00
之类的东西都会传递。
如果有其他解决方案,我不想使用explode
字符串。
谢谢/.
答案 0 :(得分:3)
您可以使用Datetime类进行测试。下面的代码将尝试从日期创建Datetime对象,只要它是指定的格式。
因此,如果您传递的日期不是您指定的时间格式的日期,则会出错。然后使用getLastErrors()进行检查。
像这样:
function checkIsDate($date){
$date = DateTime::createFromFormat('Y-m-d', $date);
$date_errors = DateTime::getLastErrors();
if ($date_errors['warning_count'] + $date_errors['error_count'] == 0) {
return TRUE;
} else {
return FALSE;
}
}
echo checkIsDate('2018-05-29')?'True':'False'; //<-- Will return true;
echo checkIsDate('2018-05-29 11:30:00')?'True':'False'; //<-- Will return false;
echo checkIsDate('05/29/2018')?'True':'False'; //<-- Will return false;
答案 1 :(得分:2)
我认为你可以使用date_parse
检查一下:http://php.net/manual/en/function.date-parse.php
您可以检查结果数组中的分钟,小时和秒:D
您也可以查看日期中的错误。
答案 2 :(得分:0)
为了完整起见,这里是一个普通的字符串函数版本:
$input = [
'2018-01-01',
'2018-01-01 15:40:43',
'2018-01-01 00:00:00',
];
foreach ($input as $string) {
list($year, $month, $day, $hour, $minutes, $seconds) = array_pad(preg_split('/[^\\d]+/i', $string, -1, PREG_SPLIT_NO_EMPTY), 6, null);
printf("%s has time? %s\n", $string, $hour!==null ? 'Yes' : 'No');
}
2018-01-01 has time? No
2018-01-01 15:40:43 has time? Yes
2018-01-01 00:00:00 has time? Yes
根据自己的喜好调整支票。
我不建议这样做。原生日期/时间功能可以更好地处理无效输入。