Из-за ограничений эпохи Unix у вас могут возникнуть проблемы с сопоставлением дат до 1970 г. и после 2038 г. Я предпочитаю потерять точность (= не смотреть на одну секунду), но избегать проходить через преобразования эпохи Unix (getTimestamp). Это зависит от того, что вы делаете, чтобы сделать ...
В моем случае использование 365 вместо (12 * 30) и "30" в качестве средней длины месяца уменьшило ошибку в полезном выводе.
function DateIntervalToSec($start,$end){ // as datetime object returns difference in seconds
$diff = $end->diff($start);
$diff_sec = $diff->format('%r').( // prepend the sign - if negative, change it to R if you want the +, too
($diff->s)+ // seconds (no errors)
(60*($diff->i))+ // minutes (no errors)
(60*60*($diff->h))+ // hours (no errors)
(24*60*60*($diff->d))+ // days (no errors)
(30*24*60*60*($diff->m))+ // months (???)
(365*24*60*60*($diff->y)) // years (???)
);
return $diff_sec;
}
Обратите внимание, что ошибка может быть 0, если «средние» величины предназначены для сравнения. Документы PHP не говорят об этом ...
В плохом случае ошибка может быть:
- 0 секунд, если diff применяется к временным промежуткам <1 месяц </li>
- от 0 до 3 дней, если разница применяется к временным промежуткам> 1 месяц
- от 0 до 14 дней, если разница применяется к временным промежуткам> 1 года
Я предпочитаю предположить, что кто-то решил считать «m» как 30 дней, а «y» - как 365, начисляя «d» с той разницей, когда «diff» проходит через не 30-дневные месяцы ...
Если кто-то знает что-то еще об этом и может предоставить официальную документацию, добро пожаловать!