Ну, есть DateTime
, у которого есть метод diff
, который может вернуть объект DateInterval
с соответствующей информацией.
Например:
$date1 = new DateTime('2020-02-08 12:43:18');
$date2 = new DateTime('2020-02-10 00:00:00');
$diff = $date1->diff($date2);
echo
$diff->days, " days,", $diff->h, " hours,", $diff->i, " minutes,", $diff->s, " seconds.";
// Gives you: 1 days,11 hours,16 minutes,42 seconds.
Для i18n, конечно, есть intl
, который имеет основанный на правилах форматер, который также может обрабатывать длительность.
Например:
// Calculate the number of seconds between two dates using DateTime
$date1 = new DateTime('2020-02-08 12:43:18');
$date2 = new DateTime('2020-02-10 00:00:00');
// Most verbosely expressed as...
$diff = $date1->diff($date2);
$seconds = $diff->days * 24 * 60 * 60;
$seconds += $diff->h * 60 * 60;
$seconds += $diff->i * 60;
$seconds += $diff->s;
// Or more simply just
$seconds = $date2->getTimestamp() - $date1->getTimestamp();
// Hand it to the formatter
$fmt = new NumberFormatter('en_US', NumberFormatter::DURATION); // set your locale here
echo $fmt->format($seconds);
// Gives you 35:16:42
Конечно, есть также объект IntlCalendar
, который может сделать это с большей степенью детализации, как вы ожидаете в своем примере выше.
Вот пример:
$cal1 = IntlCalendar::createInstance('Europe/London', 'de_DE');
$cal2 = IntlCalendar::createInstance('Europe/London', 'de_DE');
$cal1 = $cal1->fromDateTime('2020-02-08 12:43:18');
$cal2 = $cal2->fromDateTime('2020-02-10 00:00:00');
$time = $cal2->getTime();
echo
$cal1->fieldDifference($time, IntlCalendar::FIELD_YEAR), " years, ",
$cal1->fieldDifference($time, IntlCalendar::FIELD_MONTH), " months, ",
$cal1->fieldDifference($time, IntlCalendar::FIELD_DAY_OF_MONTH), " days, ",
$cal1->fieldDifference($time, IntlCalendar::FIELD_HOUR_OF_DAY), " hours, ",
$cal1->fieldDifference($time, IntlCalendar::FIELD_MINUTE), " minutes, ",
$cal1->fieldDifference($time, IntlCalendar::FIELD_SECOND), " seconds.";
// Gives you: 0 years, 0 months, 1 days, 11 hours, 16 minutes, 42 seconds.