約束どおり、 get_date_from_daynr関数によってMySQLに実装された、Cから変換されたFROM_DAYS()関数のコードをもたらします。
<?
/ **
*
* @param $年年
* @return integer
* /
プライベート 関数 calc_days_in_year ( $ year )
{
return(( $ year & 3 )== 0 &&( $ year % 100 ||( $ year % 400 == 0 && $ year )))? 366 : 365 ;
}
/ **
*
* @param $ days整数
* @return DateTime
* /
パブリック 関数 from_days ( $ days )
{
$ days_in_month = array( 31、28、31、30、31、30、31、31、30、31、30、31、0 );
$年 = 0 ;
$月 = 0 ;
$日 = 0 ;
$ days_in_year = 0 ;
$ day_of_year = 0 ;
if( $ days <= 365 || $ days > = 3652500 )
{
$年 = $月 = $日 = 0 ;
}
他に
{
$年 = 床 ( $日 * 100/36525 );
$ temp = floor ((( floor (( $ year - 1 )/ 100 )+ 1 )* 3 )/ 4 );
$ day_of_year = floor (( $ days- $ year * 365 ) -floor (( $ year - 1 )/ 4 )+ $ temp );
while( $ day_of_year >( $ days_in_year = $ this- > calc_days_in_year ( $ year ))))
{
$ day_of_year- = $ days_in_year ;
$年 ++;
}
$ leap_day = 0 ;
if( $ days_in_year == 366 )
{
if( $ day_of_year > 31 + 28 )
{
$ day_of_year- ;
if( $ day_of_year == 31 + 28 )
{
$ leap_day = 1 ;
}
}
}
$月 = 1 ;
for( $ i = 0 ;
$ day_of_year > $ days_in_month [ $ i ];
$ day_of_year- = $ days_in_month [ $ i ++]、 $ month ++);
$ day = $ day_of_year + $ leap_day ;
}
return(新しい DateTime ( "$ year- $ month- $ day" ));
}
?>
1700から2300の範囲でFROM_DAYS()と一致する関数をチェックしました。
クラスから関数を引き裂いたので、$ this-> calc_days_in_year($ year)のような呼び出しは独立した関数では機能しません。
良い使い方をしてください。