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()に対して同じことを行う必要があります。 その後、何かあれば共有します:)