Как решить загадку с датой?

Дали мне вести проект, а там дата работает через библиотеку DateTime (php). Стоит такой механизм - если дата через гет передается, то объект даты формируется из нее, иначе - дата - текущий день.
$date = $request->getParam('date');
        if (!empty($date)) {
            $date = DateTime::createFromFormat('Y-m-d', $date);
        } else {
            $date = new DateTime;
        }


Вроде все нормально работает, проблем нет. Но нужно мне проверять записи предыдущего дня. То есть, если в ГЕТ дата не передана, то записи за вчера, а если переданы - то записи за день до той даты, что передана. Прочитал как это делается, самое простое вот так:
$my_date = strtotime($date->date);
        $my_date = strtotime('-1 day', $my_date);
        $my_date = date('Y-m-d', $my_date);


Где $date - объект данных, сформированный выше, результат выглядит так:
DateTime Object ( [date] => 2018-04-01 15:30:00.000000 [timezone_type] => 3 [timezone] => Asia/Omsk )

И вроде все должно работать, но вот что интересно. Если я указываю как указал, результат получается такой:
1969-12-31
Но! Если перед этим кодом я напишу вывод объекта с датой, то ЧУДО, результат как мне нужен:
2018-03-31

spoiler
Это как так получается? Приложил наглядные скрины:
4b4b1c82b3.jpg3b59c2be97.jpg5e7a11fdeb.jpg893f7419d6.jpg


что за чудеса? И как это решить? Спасибо
  • Вопрос задан
  • 406 просмотров
Пригласить эксперта
Ответы на вопрос 3
Minifets
@Minifets
Hello world!!!
А так пробовали?

/** @var \DateTime $date */
$date->modify('-1 day');
Ответ написан
Skiphog
@Skiphog
Crutch developer
Создайте дату сразу "вчерашним днем"
///...
} else {
    $date = new DateTime('yesterday');
}
Ответ написан
@BorisKorobkov Куратор тега PHP
Web developer
Во-первых, очень плохая идея использовать одну и ту же переменную как для строки, так и для объекта.

Во-вторых, надо еще проверять правильность даты. Если она пришла, но не в формате, то может создан объект с нулевой датой (началом unix-эпохи, то есть 1970-01-01)

В-третьих, укажите test-case со своей проблемой. Чтобы его можно было запустить у себя для проверки.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы