从输入字符串格式化日期时间

时间:2012-06-27 13:36:49

标签: php

我正在做一个日期搜索过滤器,我的日期显示为“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函数修复,还是应该自己创建?

非常感谢帮助。

2 个答案:

答案 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。

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