PHP:MySQLのTO_DAYS()関数のポート

PHPのTO_DAYS()関数の類似物が必要になったとき。 素朴な私は、膨大な関数セットの中に、MySQLのTO_DAYS()を実装する必要があると考えました。 しかし、私の検索は無駄でした。 私はグーグルで調べましたが、必要な実装が見つかりませんでした。 私が見つけたのは、カテゴリからのものでした



define( "SECONDS_PER_DAY"、86400);

$ now =(int)(time()/ SECONDS_PER_DAY);



このアプローチは私には向いていませんでした。

まず、このソリューションではUNIX時代の始まりからの日数をカウントしましたが、MySQLでは0000-00-00の日付からでした。つまり、数値を少し合わせると一致しませんでした。 もちろん、UNIX時代以前の日数を追加することもできますが、これにより有効な日付の範囲が大幅に縮小されます。

第二に、数日は23時間、約25時間(夏時間と冬時間に切り替わるとき)は考慮されませんでした。

さらに、タイムスタンプによって、タイムゾーンを知らずに現在の数字を正確に知ることは不可能です(ただし、これは特別な問題ではありません)。



最も重要な基準は、関数の結果とMySQLのTO_DAYS()の結果の一致でした。 そうだとすれば、MySQL自体のソースコードでこの関数を探しに行きました。 悲しみが半分になって、 calc_daynr関数が見つかりました。Item_func_to_days:: val_int()関数これらの日数を計算するために呼び出します



単純な変換の後、Cで記述されたコードはPHPのコードに変わりました。 PHPで日付を操作する際の最新の傾向を考慮して入力パラメーターをわずかに変更し、次の機能を取得しました。



<?

define "YY_PART_YEAR" 70 );

define "YY_MAGIC_BELOW" 200 );



関数 to_days DateTime $ date

{

$ year = $ date- > format "Y" );

$ month = $ date- > format "m" );

$ day = $ date- > format "d" );



if( $ year == 0 && $ month == 0 && $ day == 0

{

0を 返し ます

}

if( $ year < YY_MAGIC_BELOW

{

if(( $ year = $ year + 1900 )< 1900 + YY_PART_YEAR

{

$年 + = 100 ;

}

}

$ delsum = 365 * $ year + 31 *( $ month - 1 )+ $ day ;

if( $ month <= 2

{

$年 -;

}

他に

{

$ delsum- = floor (( $ month * 4 + 23 )/ 10 );

}

$ temp = floor (( floor $ year / 100 )+ 1 )* 3/4 );

戻り $ delsum + $ year / 4- $ temp );

}

?>



私がこのコードを完全に理解していると思うなら、あなたは間違っています。 少なくともこの行の価値は何ですか:



$ delsum- = floor (( $ month * 4 + 23 )/ 10 );



しかし、これはこの段階では必要ありません。主なことは仕事です。

1700から2300までのTO_DAYS()との一致をチェックしました-単一のエラーではありません。

だから誰かがそれを必要とするなら、健康のためにそれを使ってください。



PSここで、FROM_DAYS()に対して同じことを行う必要があります。 その後、何かあれば共有します:)



All Articles