date_diff возвращает сумасшедшие вещи

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

Поэтому я возвращаю такие вещи, как «завтра в 16:00», «вчера в 15:00», «сегодня в 12:00», «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-> days не является ответом. Это всегда возвращает абсолютное, а не отрицательное значение, что может быть проблемой.


person Base Desire    schedule 28.08.2012    source источник


Ответы (2)


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

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

// set $today to today's date at 0:00

$diff = $meeting_day->diff($today);

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

person adhominem    schedule 28.08.2012
comment
К сожалению, это все еще дало -0 и +0. Я думал, что установка сегодняшней даты на 0:00 может помочь. - person Base Desire; 28.08.2012
comment
Я укажу это как принятый ответ, потому что без вашего предложения установить значение 0:00 я бы не решил его. Вы были в основном правы, на самом деле все, что мне нужно было изменить, было в моем текущем коде, который у меня уже есть, просто измените текущую дату на время 0:00 И время даты встречи для сравнения с 0:00, поэтому его строгое сравнение на основе on 0:00 , но захватывая время с исходной даты для целей отображения! Спасибо! - person Base Desire; 28.08.2012
comment
Ну, это то, что я имел в виду. Извините, я не был достаточно ясен, и рад, что вы все равно поняли это. - person adhominem; 28.08.2012
comment
ах Да, я не уверен, почему тогда ваш метод не сработал, возможно, что-то упустил. Несмотря на то, что вы получили от меня баллы за правильный ответ :) Хотя ваш синтаксис неверен для createFromFormat, я понял идею - person Base Desire; 28.08.2012

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

время()

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

strtotime()

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

person Delorean    schedule 28.08.2012
comment
В итоге я использовал другое решение, я уверен, что это сработало бы, но потребовало бы совсем немного изменений, поскольку, к сожалению, вы не можете легко получить эту информацию с помощью date_diff. - person Base Desire; 28.08.2012