2012-06-27 62 views
1

我正在做一个日期搜索过滤器,我的日期显示为“j.n.Y G:i(26.6.2012 15:22)”。 用户可以输入整个日期或只输入整个日期的一部分:“26.6”,“6.2012”,“6”,“15:22”均为有效输入。因为我需要在数据库中检查此日期,所以需要将格式更改为数据库中的一个。对于我使用:输入字符串的格式datetime

$datum = '25.6.2012'; 
$date = DateTime::createFromFormat('j.n.Y',$datum); 
echo $date->format('Y-m-d H:i'); 

如果我得到一个错误,如果$数据是不是在格式j.n.Y(如果我只输入j.n或上述弦线部分之一,我得到一个错误)。

问题在于,对于输入的字符串'j.n.Y',我得到日期的正确输出,该日期还将当前时间添加到日期字符串中(不在初始日期字符串中)。例如:我输入“22.6.2012”,然后输出“2012-06-22 15:33”。

这两个问题可以修复现有的PHP函数还是应该自己做?

帮助将不胜感激。

+0

'strtotime'或'strftotime'可能会稍微缓解一些任务。 – hjpotter92

回答

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); 
+0

谢谢你的帮助! – ifsession

0

对于第一个问题,你需要写一些自己的代码,因为一些Y的我们可接受的输入不在公认的输入格式中。规范输入值将需要您完全解析它(正则表达式是一种很好的开始方式),然后您可以毫无困难地致电DateTime::createFromFormat

对于第二个问题,在格式字符串的开头加上感叹号!可以解决时间问题。从documentation

如果格式包含字符!,则在格式不设置,以及值提供给左侧的 的产生 时间部分,将被设定为对应的值从Unix时代开始。

Unix时代是1970-01-01 00:00:00 UTC。

但是,由于您将需要如上所述完全解析输入,所以此问题没有实际意义。另请注意,惊叹号会导致年,月和日的缺失值使用可能不需要的默认值。

+0

谢谢你的回答,它也帮助我! – ifsession