Как рассчитать разницу дат в календарных месяцах? - PullRequest
0 голосов
/ 29 сентября 2011
$time_start = mktime(12,0,0,1,1,2011);
$time_end = mktime(12,0,0,7,1,2011);
$format = '%m months';

$start_date = new DateTime(date(DATE_ATOM,$time_start));
$end_date = new DateTime(date(DATE_ATOM,$time_end));
$diff = $start_date->diff($end_date, true);
echo $diff->format($format);

Вывод "5 месяцев", я думаю, потому что он выключен на час из-за летнего времени. Однако мне нужно рассчитать разницу в календарных месяцах; Есть ли другой класс / функция, которая будет это делать?


Добавлено несколько исправлений:

if($time_start > $time_end) list($time_start, $time_end) = array($time_end, $time_start);
$time_end += (date('I',$time_end)-date('I',$time_start))*3600; // correct for DST
$start_date = new DateTime(date(DATE_ATOM,$time_start));
$end_date = new DateTime(date(DATE_ATOM,$time_end));
$start_date->modify('12pm'); // ignore time difference
$end_date->modify('12pm');
$diff = $start_date->diff($end_date);
echo $diff->format($format);

Это, кажется, дает желаемые результаты, но я еще не полностью проверил это.


Дополнительные исправления, основанные на предложениях Герберта:

if($time_start > $time_end) list($time_start, $time_end) = array($time_end, $time_start);
$start_date = new DateTime();
$end_date = new DateTime();
$start_date->setTimestamp($time_start);
$end_date->setTimestamp($time_end);
$diff = $start_date->diff($end_date);
$hours = $diff->format('%h');
$mins = $diff->format('%i');
$secs = $diff->format('%s');
$start_date->setTime(12,0,0);//ignore time difference for date calculations
$end_date->setTime(12,0,0);
$diff = $start_date->diff($end_date);
$years = $diff->format('%y');
$months = $diff->format('%m');
$weeks = $diff->format('%w');
$days = $diff->format('%d');

Обратите внимание, что $start_date->modify('12pm') вообще ничего не делал. Не уверен, почему это не ошибка.

1 Ответ

2 голосов
/ 29 сентября 2011

Обновление

После того, как я возился с множеством разных идей, мне пришло в голову, что метки времени указаны в GMT (UTC).date(DATE_ATOM,$time_start) применяет часовой пояс по умолчанию.Однако, если вы установите временную метку явно , DateTime примет UTC - таким образом, нет проблем с летним временем.

Следующий код , кажется, работает независимо от часового пояса илиDST.

<?php

$time_start = mktime(12,0,0,1,1,2011);
$time_end = mktime(12,0,0,7,1,2011)

$start_date = new DateTime();
$end_date = new DateTime();

$start_date->setTimestamp($time_start);
$end_date->setTimestamp($time_end);

$diff = $start_date->diff($end_date);

$format = '%m months';
echo $diff->format($format);

?>

Я протестировал некоторые крайние случаи - и дату, и время, и различные часовые пояса - но я не проверял каждую возможность, поэтому еслиВы сталкиваетесь с проблемой, мне было бы интересно услышать об этом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...