Что касается этой темы, я разработал частичный решение:
function strtosecs($time,$now=null){
static $LEAPDIFF=86400;
$time=strtotime($time,$now);
return $time-(round((date('Y',$time)-1968)/4)*$LEAPDIFF);
}
Предполагается, что функция получает количество секунд, заданных строкой, без проверки високосных лет.
Он делает это, вычисляя количество високосных лет 1970 [(year-1986)/4], умножая его на разницу в секундах между високосным и обычным годом (что, в конце концов, это просто количество секунд в день).
Наконец, я просто удаляю все эти лишние секунды високосного года из вычисляемого времени. Вот несколько примеров входов/выходов:
// test code
echo strtosecs('+20 years',0).'=>'.(strtosecs('+20 years',0)/31536000);
echo strtosecs('+1 years',0).'=>'.(strtosecs('+1 years',0)/31536000);
// test output
630676800 => 19.998630136986
31471200 => 0.99794520547945
Вы, наверное, спросите, почему я делаю деление на выходе? Это проверить это; 31536000 — это количество секунд в году, так что 19,99... должно быть 20, а 0,99... должно быть 1. Конечно, я мог бы округлить все это и получить «правильный» ответ, но меня беспокоит неточности.
Edit1: Поскольку это не кажется очевидным, моя проблема связана с неопытностью; вы просто не спрашиваете PHP в течение 20 лет, и он дает вам 19,99 ..., верно?
Edit2: Все, кажется, сводится к части о 1968 году;
- 1970 г.; нашел его точным во всех тестах, которые я пробовал.
- 1969 год; Найдено здесь (
...ex: (2008-1969)/4 = 9.75...
), а также упоминается здесь. Точно после 2-го года (+3 года) и далее. - 1968 год; как подробно описано ниже, это «нулевой год» високосных лет от времени Unix (1970). Звучит "правильно" (для меня), но совсем неточно.