代码之家  ›  专栏  ›  技术社区  ›  Andrew

如何以Zend框架形式创建日期时间验证器?

  •  3
  • Andrew  · 技术社区  · 15 年前

    默认情况下,Zend框架日期验证器使用日期格式 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 而不是强制用户以给定格式输入日期。

    我怎样才能强制要求输入给定格式的日期?

    3 回复  |  直到 12 年前
        1
  •  4
  •   Noah Goodrich    15 年前

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

    基本上,归根结底就是格式验证的基础代码不能正常工作。它不会使用严格的验证,而是试图将提供的日期强制为将要验证的内容,这样您就可以得到可靠的结果。

    看起来这个bug已经被标记为“major”,所以希望我们很快就能看到修复。

        2
  •  4
  •   Stephen Fuhry Bobby    13 年前

    为了补充诺亚的答案, 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是否足够智能来解析它。

        3
  •  1
  •   nubeiro    12 年前

    +斯蒂芬的答案。 我选择了类似的解决方案,因为我已经知道必须验证的格式:

    $validator = new \Zend_Validate_Callback(function($value) {
    
        return (bool) date_create_from_format('Y-m-d H:i', $value);
    });