FitTech
@FitTech

Как правильно сравнить даты?

В форме есть правила проверки на даты:

['birth_date', 'date', 'timestampAttribute' => 'birth_date', 'timestampAttributeFormat' => 'php:Y-m-d'],
['death_date', 'date', 'timestampAttribute' => 'death_date', 'timestampAttributeFormat' => 'php:Y-m-d'],
['death_date', 'compare', 'compareAttribute' => 'birth_date', 'operator' => '>'],

death_date должно быть больше чем birth_date, но проблема в том, что оно возвращает true когда в случае если:
1991-12-02 birth_date
1992-12-04 death_date
А такое уже false, обратите внимание на дни.
1991-12-02 birth_date
1992-12-01 death_date

Почему так?
  • Вопрос задан
  • 1373 просмотра
Решения вопроса 3
@AnneSmith
самая ленивая
всегда все даты сравнивайте в timestamp и будет вам счастье
Ответ написан
Комментировать
slo_nik
@slo_nik Куратор тега Yii
Добрый вечер.
Переделайте под себя эту проверку.
['date_to', 'date', 'when' => function($model){
                 return strtotime($model->date_to) < strtotime($model->date_from);
}]

Вы пытаетесь сравнить строку. Вам надо перевести эти строки в даты. Делается эти при помощи strtotime();, хотя есть и другие варианты перевести строку в дату.
Ответ написан
mhthnz
@mhthnz
PHP, YII2, Golang, Linux
Вариантов много, можно создать свой валидатор:
['birth_date', 'date', 'timestampAttribute' => 'birth_date', 'timestampAttributeFormat' => 'php:Y-m-d'],
['death_date', 'date', 'timestampAttribute' => 'death_date', 'timestampAttributeFormat' => 'php:Y-m-d'],
['death_date', function($attribute, $params) {
    if (\DateTime::createFromFormat("Y-m-d", $this->{$attribute})->getTimestamp() < \DateTime::createFromFormat("Y-m-d", $this->birth_date)->getTimestamp()) {
    $this->addError($attribute, 'Дата смерти не может быть меньше даты рождения.');    
}
}]


Можно все это проверять в afterValidate():
if (\DateTime::createFromFormat("Y-m-d", $this->death_date)->getTimestamp() < \DateTime::createFromFormat("Y-m-d", $this->birth_date)->getTimestamp()) {
    $this->addError($attribute, 'Дата смерти не может быть меньше даты рождения.');    
}
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы