разница в датах, возвращающие сумасшедшие вещи


Сегодня бьюсь головой о стену, работая с датами. Я просматриваю кучу дат и сравниваю их с текущей датой, чтобы определить, насколько они далеки.

Поэтому я возвращаю такие вещи, как "завтра в 4 часа дня", "вчера в 3 часа дня", "сегодня в 12 часов", "3 дня назад", "через 3 дня" и т. Д.

Все это прекрасно работает, пока не дойдет до сегодняшнего/завтрашнего/вчерашнего дня.

Разница в датах возвращает глупые вещи, такие как -0 и +0, когда доходит до этих дат. Мой теория заключается в том, что даты, которые, скажем... 23 часа в будущем или даже 10 часов в будущем, даже если они состоятся на "следующий день", возвращаются как 0 вместо 1.

К сожалению, date_diff, похоже, не возвращает десятичные дроби и не позволяет мне делать какие-либо округления.

Вот пример кода:

$difference = $meeting_date->diff($current_date);
$difference = $difference->format('%R%a');

Затем я проверяю это целое число разности, чтобы увидеть, равно ли оно 0, -1, 1, <-1 или > 1. Я обрабатываю предыдущий знак + там, где это необходимо.

Те, которые должно быть -1 или +1, иногда возвращаются как -0 или +0 (..что?)

Кроме того, -0 не равно 0, но, по-видимому, меньше -1 в соответствии с PHP.

S.O.S, кто-нибудь, помогите.

Я прочитал все связанные с этим вопросы, это не дубликат и не связано с этой случайной ошибкой 6015. Также использование diff->дней не является ответом. Это всегда возвращает абсолют, а не отрицательные значения, что было бы проблемой.

Author: animuson, 2012-08-28

2 answers

Хм... Мой подход здесь состоял бы в том, чтобы разделить отображение времени и даты. Что-то вроде этого:

$meeting_day = DateTime::createFromFormat($meeting_date->format('Y-m-d'));

//установите $today на сегодняшнюю дату в 0:00

$diff = $meeting_day->разница ($сегодня);

Это должно дать вам полезную разницу в зависимости от дня (для визуализации сегодня, вчера, завтра и т.д.).

 1
Author: adhominem, 2012-08-28 14:21:48

Вместо сравнения дней, почему бы не сравнить time() с другим временем даты, которое вы можете отформатировать с помощью strtotime()

Время()

Вы можете конвертировать любую дату и время, с которыми вы сравниваете, в strtotime()

Strtotime - Время()

И теперь вы можете сравнить разницу в двух секундах и разделить, как считаете нужным, на дни, часы и т. Д.

 1
Author: Dorian, 2012-08-28 14:23:16