Получение дней из DateTime() выше 30/31, чтобы они не переносились на месяцы

Я вычисляю разницу между двумя датами, используя DateTime(), и все работает нормально. Проблема в том, что я хочу, чтобы формат дней мог превышать полный месяц, поэтому 30/31 или выше.

$now = new DateTime();
$future_date = new DateTime($contest->expires_at);

$interval = $future_date->diff($now);
$enddate = $interval->format("%m month, %d days, %h hours, %i minutes");

Текущая проблема с этим заключается в том, что когда я не показываю месяцы, дни могут увеличиваться только до 30/31, и все, что сверх этого, будет перенесено, чтобы сделать новый месяц сбросом счетчика дней с оставшимися днями. Я хочу иметь возможность отображать 42 дня, когда разница составляет 6 недель с таким форматом:

$enddate = $interval->format("%d days, %h hours, %i minutes");

Есть ли быстрое решение для этого или мне нужно вручную преобразовать метку времени в секунды и использовать для этого мою собственную функцию с операторами модуля?


person Stephan-v    schedule 25.04.2013    source источник
comment
Эта помощь? stackoverflow.com/questions/2040560/   -  person baarkerlounger    schedule 25.04.2013
comment
Используйте %a вместо %d (как описано в документации для формата) - php.net /manual/en/dateinterval.format.php   -  person Mark Baker    schedule 25.04.2013


Ответы (3)


Можешь попробовать:

$enddate = $interval->format("%a days, %h hours, %i minutes");

См. DateInterval::format в руководстве.

ПРИМЕЧАНИЕ

Позаботьтесь об ошибке, если вы работаете на окнах.

person Young    schedule 25.04.2013
comment
$enddate = $interval->format("%m months, %d days, %h hours, %i minutes"); Это дает мне разницу в 0 месяцев, 6 дней, 23 часа, 52 минуты. Что правильно, так как я отсчитываю от недели. Когда я пытаюсь: $enddate = $interval->format("%a days, %h hours, %i minutes"); я получаю 6015 дней, 23 часа, 50 минут? - person Stephan-v; 25.04.2013
comment
@user2294225 user2294225 это странно. Я проверил ваш код с 2013-06-01 00:00:00 как ваш $contest->expires_at, и он показывает мне правильный ответ 36 days, 6 hours, 14 minutes. Какая у вас версия php? - person Young; 25.04.2013
comment
@ user2294225, кажется, вы уже нашли ошибку в Windows. :) - person Young; 25.04.2013

Это должно решить вашу проблему:

$now = new DateTime();
$future_date = new DateTime();

// a period of 2 months
$addPeriod = new DateInterval('P2M');

// adding the period
$future_date->add($addPeriod);

// get the differnce
$interval = $future_date->diff($now);

echo($interval->days) . ' days';

На сегодня: echo возвращает «61 день»

// РЕДАКТИРОВАТЬ

Чтобы не столкнуться с ошибкой dataInterval-Bug, вы можете использовать:

$now = new DateTime();
$future_date = new DateTime();

// a period of 2 months
$addPeriod = new DateInterval('P2M');

// adding the period
$future_date->add($addPeriod);

// get the difference in second
$diffTimestamp = $future_date->getTimestamp() - $now->getTimestamp();

// convert to days
// 1 day = 86.400 seconds
$diffDays = $diffTimestamp/86400;

echo(floor($diffDays)) . ' days';
person alsleben    schedule 25.04.2013
comment
Я получаю только 6015 дней. После просмотра я нашел ошибку в этой версии php? ссылка на сообщение stackoverflow, в котором обсуждается та же проблема - person Stephan-v; 25.04.2013

Обновите мою версию php, так как это ошибка в моей старой, и теперь она работает отлично.

Как получить совокупные дни из PHP DateTime::diff?

person Stephan-v    schedule 27.04.2013