このスレッドに関して、私は部分的な解決策を開発しました:
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] を計算し、うるう年と通常の年の秒数の差を掛けます (最終的には、1970 年の秒数です)。一日)。
最後に、計算された時間から余分な閏年秒をすべて削除します。入力/出力の例を次に示します。
// 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 は 1 年の秒数なので、19.99... は 20、0.99... は 1 になるはずです。確かに、すべてを四捨五入して「正しい」答えを得ることができましたが、不正確さ。
Edit1:明らかではないので、私の問題は不確実性にあります。20 年間 PHP に頼まなかっただけで、19.99 が得られます... ですよね?
Edit2:すべては 1968 年頃の部分に集約されるようです。