php DateTime diff учитывает только формат Y-m-d

В mysql db у меня есть поле метки времени (dateexp), определенное в моей таблице t1. с запросом я рассматриваю только формат Y-m-d временной метки для поиска записей. Используйте curdate() вместо now()

SELECT * FROM t1 WHERE dateexp < currdate()

Я хотел бы сделать то же самое с php, используя класс DateTime, чтобы найти количество дней до даты, но я не могу понять, как я мог это сделать, сравнивая только формат Y-m-d.

Я пробовал таким образом, но я использую формат Y-m-d H:i:s.

$row['dateexp'] = "2013-11-10 12:00:00";

$d1 = new DateTime();
$d2 = new DateTime($row['dateexp']);
$interval = $d1->diff($d2);
$days = $interval->format('%r%a');

Как я мог сделать это для сравнения только Y-m-d? Я пробовал с DateTime::createFromFormat, но, вероятно, неправильно.

Спасибо


person Paolo Rossi    schedule 06.11.2013    source источник
comment
Пожалуйста, уточните, что вы имеете в виду под «только даты». Итак, вам нужно создать объект DateTime только с частью даты? Или найти разницу в днях (поэтому время имеет значение)?   -  person Alma Do    schedule 06.11.2013
comment
Я хотел бы найти разницу двух дат в формате Y-m-d (2013-11-05), а не в формате Y-m-d H:i:s (2103-11-05 11:00:00). часы, минуты и секунды влияют на результат в зависимости от того, указано ли время до или после   -  person Paolo Rossi    schedule 06.11.2013


Ответы (2)


У вас есть несколько возможных способов сделать это. Во-первых, вы можете выбрать строку даты в нужном формате из СУБД:

SELECT *, DATE(dateexp) AS date_holder FROM t1 WHERE dateexp < currdate()

а затем примените его к своему объекту DateTime:

$d1 = new DateTime(date('Y-m-d'));
$d2 = new DateTime($row['date_holder']);
$interval = $d1->diff($d2);
$days = $interval->format('%r%a');

Во-вторых, вы можете, как вы упомянули, создать DateTime из формата:

$d1 = new DateTime(date('Y-m-d'));
$d2 = new DateTime(date('Y-m-d', strtotime($row['dateexp'])));
$interval = $d1->diff($d2);
$days = $interval->format('%r%a');

-так вы сможете избежать выбора дополнительного поля в СУБД

person Alma Do    schedule 06.11.2013

PHP

Не смешивайте функции date() и strtotime() с расширением DateTime.

Вы можете просто создать объект DateTime с ключевым словом today, чтобы установить сегодняшнюю дату без времени, или использовать DateTime::setTime() в объекте DateTime, чтобы установить желаемое время:

$d1 = new DateTime('today');
$d2 = new DateTime($row['dateexp']);
$d2->setTime(0, 0);
echo $d1->diff($d2)->format('%r%a');

Демо.


MySQL

Или вы уже можете рассчитать разницу в днях в MySQL с помощью функции TIMESTAMPDIFF:

SELECT TIMESTAMPDIFF(DAY, CURDATE(), DATE('2013-11-10 12:00:00'))

или в вашем случае:

SELECT *, TIMESTAMPDIFF(DAY, CURDATE(), DATE(dateexp)) AS diff_in_days
FROM t1 
WHERE dateexp < CURDATE()
person Glavić    schedule 06.11.2013