Разница между двумя датами в месяцах в php

Я пытаюсь получить разницу между двумя месяцами. Например, ниже я бы хотел 2 месяца.

$datetime1 = date_create('2017-03-01');
$datetime2 = date_create('2017-04-30');
$interval = date_diff($datetime1, $datetime2);
echo $interval->format('%m months');
echo $interval->format('%d days');

Это дает мне 2 месяца и 1 день.


person user5349142    schedule 15.03.2017    source источник
comment
Забавно, это дает мне 1 months 29 days чего я и ожидал   -  person RiggsFolly    schedule 15.03.2017
comment
Зачем вам нужен результат 2 months, если между этими датами нет 2 месяцев??   -  person RiggsFolly    schedule 15.03.2017
comment
@RiggsFolly как ни странно; Я тоже получаю 2 months1 days на 5.6.24, если часовой пояс по умолчанию не используется. При использовании date_default_timezone_set('America/New_York'); я получаю обратно 1 months29 days - так что это вероятный ответ на этот вопрос.   -  person Funk Forty Niner    schedule 15.03.2017
comment
@ Fred-ii- :) Я просто собирался поиграть с часовыми поясами, так как только что заметил, что даты были в то время, когда часы меняются.   -  person RiggsFolly    schedule 15.03.2017
comment
если я использую date_default_timezone_set('America/New_York'); затем он показывает 2, но с моим фактическим часовым поясом date_default_timezone_set('Africa/Nairobi'); все равно показывает 3   -  person user5349142    schedule 15.03.2017
comment
@user5349142 user5349142 это может зависеть от того, где находится ваш сервер и размещен ли он.   -  person Funk Forty Niner    schedule 15.03.2017
comment
Я работаю через xampp на локальном сервере.   -  person user5349142    schedule 15.03.2017
comment
@ user5349142 или, если вы внесли какие-либо изменения в свои системные файлы и находитесь на своем компьютере, убедитесь, что вы перезапустили все службы. Эти изменения не вступят в силу, пока вы этого не сделаете.   -  person Funk Forty Niner    schedule 15.03.2017
comment
@ user5349142 Риггс хорошо заметил в своем комментарии под моим ответом о переходе на летнее время - вот ссылка stackoverflow.com/questions/19755820/   -  person Funk Forty Niner    schedule 15.03.2017
comment
Вы получите правильный ответ, если используете date_default_timezone_set('UTC');   -  person RiggsFolly    schedule 15.03.2017
comment
@RiggsFolly выглядит многообещающе ^ но ОП не отвечает на несколько комментариев, которые я оставил.   -  person Funk Forty Niner    schedule 15.03.2017
comment
с date_default_timezone_set('UTC'); Я получаю правильный ответ, но не повлияет ли это на часовой пояс во всем проекте?   -  person user5349142    schedule 15.03.2017
comment
Нет, если вы установите его на UTC перед запуском этого кода, а затем вернете его в свой часовой пояс после завершения этого кода.   -  person RiggsFolly    schedule 15.03.2017
comment
хорошо так и сделаю. До сих пор не уверен, почему это происходит, поскольку в моем регионе нет летнего времени.   -  person user5349142    schedule 15.03.2017


Ответы (1)


Причина, по которой вы получаете неправильный результат, скорее всего, в том, что вы не установили часовой пояс по умолчанию, один для «вашего» часового пояса.

В добавлении и например:

date_default_timezone_set('America/New_York');

вернул правильную разницу во времени, хотя не использовал ее, вернул то, что вы сейчас получаете.

Используйте тот, который соответствует вашему часовому поясу, или установите его в системных файлах.

Из руководства http://php.net/manual/en/datetime.diff.php в разделе «Примечания, внесенные пользователями»:

"При использовании datediff убедитесь, что ваш часовой пояс правильный, для меня в 64-разрядной версии Windows 7 он вел себя очень странно, когда часовой пояс был неправильным (я сравнивал сейчас со временем в базе данных и метаданными exif на фотографиях). Например: date_default_timezone_set ('Европа/Осло');"

и просмотрите остальную часть «Заметок, внесенных пользователями».

  • Другой возможной причиной может быть расположение сервера, которое отличается от «вашего» положения на «земле».

Соответствующая ссылка из комментариев, предоставленных RiggsFolly:

что тут может быть.


Изменить:

Заметив, что ОП принимает этот ответ, взятый из комментария RiggsFolly, нужно было также добавить:

date_default_timezone_set('UTC');

Я бы назвал это совместным предприятием, и я не могу взять на себя полную ответственность за это.

person Funk Forty Niner    schedule 15.03.2017
comment
Напрашивается вопрос, что у вас и у OP date.timezone ="???" установлено в вашем php.ini файле. - person RiggsFolly; 15.03.2017
comment
@RiggsFolly Я отредактировал ответ, и я не знаю, так как они, вероятно, не мои соседи ;-) - person Funk Forty Niner; 15.03.2017
comment
Я думаю, что это отвечает на вопрос stackoverflow .com/questions/19755820/ - person RiggsFolly; 15.03.2017
comment
@RiggsFolly Хорошее шоу о UTC; Я отредактировал ответ, отдав вам должное; Спасибо за это ;-) - person Funk Forty Niner; 15.03.2017
comment
Та, Кред не нужен. Назовите это «Командная работа на международной основе» или «Руки по воде». - person RiggsFolly; 15.03.2017
comment
@RiggsFolly Ты слишком скромный. Вы заслужили упоминание, так как вы также помогли полностью решить эту проблему. - person Funk Forty Niner; 15.03.2017