1

我正在做一个日期搜索过滤器,我的日期显示为“jnY 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 的格式不是 jnY,我会收到错误消息(如果我只输入 jn 或上述字符串部分之一,我会收到错误消息)。

还有一个问题是,对于输入的字符串'jnY',我得到了正确的日期输出,它也将当前时间添加到日期字符串中(它不在初始日期字符串中)。示例:我输入“22.6.2012”,然后得到输出“2012-06-22 15:33”。

这两个问题可以用现有的 php 函数解决还是我应该自己解决?

帮助将不胜感激。

4

2 回答 2

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()date 对象上的方法:

// Sets the time to O hours, 0 minutes, 0 seconds
$date->setTime( 0, 0, 0);
于 2012-06-27T13:45:51.223 回答
0

对于第一个问题,您需要自己编写一些代码,因为您可以接受的一些输入不在可识别的输入格式中。规范化输入值将需要您完全解析它(正则表达式是一个很好的开始方式),然后您可以DateTime::createFromFormat毫无问题地调用。

!对于第二个问题,在格式字符串的开头放置一个感叹号可以解决时间问题。从文档中:

如果 format 包含字符!,则 format 中未提供的部分生成时间以及 ! 左侧的值将设置为 Unix 纪元的相应值。

Unix 纪元是 1970-01-01 00:00:00 UTC。

但是,由于您将需要完全解析上面提到的输入,所以这件事没有实际意义。另请注意,感叹号会导致年、月和日的缺失值使用可能不受欢迎的默认值。

于 2012-06-27T13:45:54.187 回答