1

我遇到了 Zend_Date::isDate 返回 true 的问题,即使该值不一定与给定的格式匹配。

例如:

$time = "12:34:56"; // Time doesn't have AM/PM attached

if( Zend_Date::isDate($time, 'hh:mm:ss a') )
    echo "this is true";
else
    echo "this is false";

这总是正确的,即使格式列出了表示它需要“时间,本地化”的“a”(在我的例子中是“AM”/“PM”)。即使是格式完全错误的时间,例如 '12:12:34:56:56' 仍然会返回 true。然而,':34:56' 的时间将返回 false。这是一个错误还是我在认为我给它的格式是需要匹配的格式时遗漏了什么?

谢谢!

4

1 回答 1

3

我不认为 Zend_Date 是为了“强制”一种格式而构建的。它旨在回答“如果我给 Zend_Date 这个字符串,你能以这种格式推送它吗?” 这真的很误导人。

在您的示例中,这是真的,但它实际上评估为:

Jan 25, 35 12:00:00 AM

你可能没想到。

在您的虚假示例中,这也是正确的,它的计算结果为:

Dec 14, 34 8:56:00 AM (Dec 12, 34 + 56 hours and 56 minutes)

验证日期,我认为您想要做的是使用 Zend_Validator ...

    $validator = new Zend_Validate_Date(array('format' => 'hh:mm:ss a'));
    var_dump($validator->isValid("12:34:56 pm")); // true
    var_dump($validator->isValid("14:34:56 pm")); // false, actually 2pm
    var_dump($validator->isValid("01:11:11 am")); // true
    var_dump($validator->isValid("01:11:11 xm")); // true, 24h fallback
    var_dump($validator->isValid("24:01:01")); // false
    var_dump($validator->isValid("16:01:01")); // true, 24h fallback

如果您首先通过验证运行日期,然后进入 Zend_Date,您应该会得到预期的结果。

于 2010-12-08T20:24:10.550 回答