我正在做一个日期搜索过滤器,我的日期显示为“j.n.Y G:i(26.6.2012 15:22)”。 用户可以输入整个日期或仅输入其中的一部分:“26.6”,“6.2012”,“6”,“15:22”都是有效输入。因为我需要在数据库中检查这个日期,所以需要将格式更改为数据库中的一个。为此,我使用:
$datum = '25.6.2012';
$date = DateTime::createFromFormat('j.n.Y',$datum);
echo $date->format('Y-m-d H:i');
如果$ datum的格式不是j.n.Y(如果我只输入j.n或上面提到的字符串部分之一,我会收到错误),我会收到错误。
问题还在于,对于输入的字符串'j.n.Y',我得到了日期的正确输出,它也将当前时间添加到日期字符串(不在初始日期字符串中)。示例:我输入“22.6.2012”,然后输出“2012-06-22 15:33”。
这两个问题可以通过现有的php函数修复,还是应该自己创建?
非常感谢帮助。
答案 0 :(得分:1)
您可以在数组中列出可接受的数据格式,并循环DateTime::createFromFormat()
以查看是否有任何输入产生了可接受的日期:
$formats = array( 'j.n', 'j.n.Y');
$datum = '25.6.2012'; $date = false;
foreach( $formats as $format) {
$date = DateTime::createFromFormat( $format, $datum);
if( !($date === false)) break;
}
if( $date === false) {
echo "Invalid date!\n";
}
最后,如果你想摆脱新创建的对象中的当前时间并将时间设置为00:00:00
,只需在日期对象上使用setTime()
方法:
// Sets the time to O hours, 0 minutes, 0 seconds
$date->setTime( 0, 0, 0);
答案 1 :(得分:0)
对于第一个问题,您需要编写自己的一些代码,因为某些可接受的输入不属于可识别的输入格式。规范化输入值将要求您完全解析它(正则表达式是一种好的开始方式),然后您可以毫无问题地调用DateTime::createFromFormat
。
对于第二个问题,在格式字符串的开头添加感叹号!
将解决时间问题。来自documentation:
如果format包含字符
!
,则生成部分 时间未提供格式,以及左侧的值 !,将被设置为Unix纪元的相应值。Unix纪元是1970-01-01 00:00:00 UTC。
但是,由于您需要完全解析上面提到的输入,因此问题没有实际意义。另请注意,感叹号会导致年,月和日的缺失值使用可能不合需要的默认值。