Yii2日期比较不在规则内部工作()

时间:2016-05-18 07:04:44

标签: php yii2 yii2-basic-app yii2-model yii2-validation

我有一个表单,用户必须输入开始日期和结束日期。

我在rules方法中使用compare属性,因为用户无法输入在开始日期之前的结束日期。

这是表单模型中的规则方法:

['dateFinTR', 'date', 'format' => 'php: d/m/Y'],
['dateFinTR', 'compare', 'compareAttribute' => 'dateDebutTR', 'operator' => '>=', 'skipOnEmpty' => true,]

问题是如果用户输入的开始日期为2016-05-18,结束日期为2016-04-17,则会显示错误消息,并且用户无法提交表单。但是,如果用户输入2016-05-18的开始日期和2016-04-23结束的日期,则没有错误,用户无法提交表单。 事实上,只将这一天与此规则进行比较。

修改 根据这个链接:Yii2 Date compare validation,我已经创建了一个自定义验证方法,但我使用欧洲格式,所以我认为strtotime方法不是很好。 这是我的validateDates方法:

public function validateDates()
{
    if (strtotime($this->dateFinTR) <= strtotime($this->dateDebutTR))
    {
        $this->addError('dateFinTR', 'Veuillez saisir une date de fin se trouvant avant la date de début');
    }
}

这是这种方法的召唤:

['dateFinTR', 'validateDates', 'skipOnEmpty' => true],

2 个答案:

答案 0 :(得分:4)

这是一个常见的日期格式/转换问题,并非真正特定于Yii。

您可以尝试使用DateTime::createFromFormat(),例如:

public function validateDates()
{
    $date1 = \DateTime::createFromFormat('d/m/Y', $this->dateDebutTR);
    $date2 = \DateTime::createFromFormat('d/m/Y', $this->dateFinTR);
    if ($date2<=$date1) {
        $this->addError('dateFinTR', 'error message');
    }
}

但在大多数情况下,应该更好地以正确的格式(例如,使用MySQL DATE)在数据库中存储日期,并且只将它们转换为显示。

答案 1 :(得分:0)

考虑将日期检查修复为以下内容:

if (strtotime($this->dateFinTR) > strtotime($this->dateDebutTR))

活动结束日期应该大于开始日期。