Как вычислить разницу между двумя датами с помощью PHP?
У меня есть две даты в следующем формате:
Дата начала: 2007-03-24
Дата окончания: 2009-06-26
Теперь мне нужно вычислить разницу между этими двумя датами и представить результат в следующем виде:
2 года, 3 месяца и 2 дня
Как я могу это сделать на PHP?
5 ответ(ов)
Чтобы вывести разницу между двумя датами в форматах лет, месяцев, дней, часов, минут и секунд, можно использовать следующий код на PHP:
$date1 = "2008-11-01 22:45:00";
$date2 = "2009-12-04 13:44:01";
$diff = abs(strtotime($date2) - strtotime($date1));
$years = floor($diff / (365*60*60*24));
$months = floor(($diff - $years * 365*60*60*24) / (30*60*60*24));
$days = floor(($diff - $years * 365*60*60*24 - $months*30*60*60*24)/ (60*60*24));
$hours = floor(($diff - $years * 365*60*60*24 - $months*30*60*60*24 - $days*60*60*24)/ (60*60));
$minuts = floor(($diff - $years * 365*60*60*24 - $months*30*60*60*24 - $days*60*60*24 - $hours*60*60)/ 60);
$seconds = floor(($diff - $years * 365*60*60*24 - $months*30*60*60*24 - $days*60*60*24 - $hours*60*60 - $minuts*60));
printf("%d years, %d months, %d days, %d hours, %d minuts\n, %d seconds\n", $years, $months, $days, $hours, $minuts, $seconds);
Объяснение:
- Строки дат: Здесь мы определяем две даты
$date1
и$date2
. - Разница между датами: Для вычисления разницы в секундах, используем
strtotime
, чтобы конвертировать строки в метки времени. - Вычисление единиц времени:
- Сначала вычисляем годы, деля общее число секунд на количество секунд в году.
- Затем вычисляем месяцы, дни, часы, минуты и секунды аналогичным образом, последовательно убирая от общей разницы количество секунд, соответствующее уже найденным годам, месяцам и так далее.
- Вывод результата: Используем
printf
для форматированного вывода, указывая нужные переменные.
Примечание:
В коде есть небольшая опечатка: правильное написание — «minutes», а не «minuts». Вы можете заменить minuts
на minutes
в коде для корректного вывода.
Обратите внимание на следующую ссылку. Это лучший ответ, который я нашел на данный момент. 😃
function dateDiff ($d1, $d2) {
// Возвращает количество дней между двумя датами:
return round(abs(strtotime($d1) - strtotime($d2))/86400);
} // конец функции dateDiff
Не важно, какая дата раньше или позже, когда вы передаете параметры даты. Функция использует абсолютное значение ABS() в PHP, чтобы всегда возвращать положительное число как количество дней между двумя датами.
Имейте в виду, что количество дней между двумя датами НЕ включает обе даты. Поэтому, если вы хотите получить количество дней, которое охватывает все даты между и включая введенные даты, вам нужно добавить один (1) к результату этой функции.
Например, разница (как возвращается вышеуказанной функцией) между 2013-02-09 и 2013-02-14 составляет 5. Но количество дней или дат, представленных диапазоном дат с 2013-02-09 по 2013-02-14, составляет 6.
Ваш код имеет небольшую ошибку в функции printf()
. Вы забыли указать %d
для форматирования, и аргументы нужно передавать корректно. Вот исправленный вариант:
<?php
$today = strtotime("2011-02-03 00:00:00");
$myBirthDate = strtotime("1964-10-30 00:00:00");
printf("Days since my birthday: %d\n", ($today - $myBirthDate) / (60 * 60 * 24));
?>
В этом коде мы используем strtotime()
для получения временных меток для "сегодня" и даты рождения. Затем вычисляем разницу между ними, делим на количество секунд в одном дне (60 секунд × 60 минут × 24 часа) и выводим результат. Не забудьте добавить %d
в строку формата, чтобы корректно отобразить целое число дней.
Не знаю, используете ли вы фреймворк PHP или нет, но многие из них предлагают библиотеки и утилиты для работы с датой и временем, чтобы избежать создания всего с нуля.
Например, в CodeIgniter есть функция timespan()
. Просто передайте ей два Unix-временных штампа, и она автоматически создаст результат вроде этого:
1 Год, 10 Месяцев, 2 Недели, 5 Дней, 10 Часов, 16 Минут
Документацию по этой функции можно найти здесь: http://codeigniter.com/user_guide/helpers/date_helper.html
Вот рабочий код, который показывает, как вычислить разницу в днях между двумя датами на PHP:
$date1 = date_create('2007-03-24');
$date2 = date_create('2009-06-26');
$diff1 = date_diff($date1, $date2);
$daysdiff = $diff1->format("%R%a");
$daysdiff = abs($daysdiff);
В этом коде мы создаем две даты с помощью функции date_create
. Затем с помощью функции date_diff
вычисляем разницу между ними. Метод format
позволяет извлечь количество дней (%a
), а также знак разницы (%R
), который мы затем превращаем в абсолютное значение с помощью функции abs
, чтобы получить только количество дней между датами, игнорируя знак.
UTF-8 на всех уровнях!
Сортировка двумерного массива по значению в столбце
Что такое потокобезопасность и непотокобезопасность в PHP?
Как передать переменные и данные из PHP в JavaScript?
Вставка нового элемента в массив в любом месте в PHP