3

默认情况下,Zend Framework 日期验证器使用日期格式yyyy-MM-dd

$dateValidator = new Zend_Validate_Date();

但我想添加小时和分钟验证。换句话说,我想要求用户输入小时和分钟。但以下不起作用:

$dateValidator = new Zend_Validate_Date('yyyy-MM-dd hh:ii');

如果我输入2010-02-01,我会收到一条错误消息,指出日期不符合格式。如果我输入2010-02-01 3,它不会抱怨。它所做的是假设用户的意思是2010-02-01 03:00而不是强制用户以给定格式输入日期。

如何强制必须以给定格式输入日期?

4

3 回答 3

4

请参阅: http: //framework.zend.com/issues/browse/ZF-6369

基本上归结为格式验证的代码不能正常工作。它不会使用严格的验证,而是会尝试将提供的日期强制转换为可以验证的内容,因此您会得到手帕的结果。

看起来该错误已被标记为“主要”,因此希望我们很快就会看到修复。

于 2010-02-02T16:41:42.720 回答
4

补充一下诺亚的答案,Zend_Validate_Date真的很糟糕而且很不灵活;也就是说,如果您想对日期输入采取更宽容的政策。

现在,如果 ZF 附带了一个Zend_Filter_Date可以标准化各种琐碎(尽管非常可解析)格式的日期选择器/用户输入供应,那可能是另一回事,因为您可以将日期过滤为标准化格式,然后验证它是否在那种格式。但事实并非如此。

不管怎样,这个问题有很多明智的解决方案。其中最简单的可能是这样的:

$validator = new \Zend_Validate_Callback(function($value) {
    return (bool)strtotime($value);
});

就个人而言,我不在乎日期/日期时间是否以 yyyy/MM/dd、2012 年 9 月 23 日或“-2 周”的形式出现——我真正关心的是 strtotime 是否足够聪明,可以解析它。

于 2012-01-15T03:08:46.580 回答
1

+1 斯蒂芬的回答。我寻求了一个类似的解决方案,因为我已经知道我必须验证的格式:

$validator = new \Zend_Validate_Callback(function($value) {

    return (bool) date_create_from_format('Y-m-d H:i', $value);
});
于 2013-02-20T15:44:06.953 回答