2012-01-08 8 views
0

私はPHPで登録システムを構築しており、生年月日(タイムスタンプ)と年齢(4月31日)を返す関数を作成する必要があります。私が今いるものは:PHPで調整年齢を作成する

<?php 
function get_adj_age($dob) 
{ 
    $age = (time()-$dob); 
    $today = strtotime(date('F d', time())); 
    $diff = ($cutoff - $today); 
    $adj_age = floor(($age+$diff)/31556926); 

    return $adj_age; 
} 

これは私の脳を破壊しています。誰でもこのことについて私にチェックしてもらえますか?乾杯。

+0

機能全体を投稿してもよろしいですか?私は 'return $ adj_age;を疑っています;関数の範囲外のことは(インクルードされていないファイルではエラーを発生させる以外は)行います。 –

+1

$ cutoffはどこにも定義されていないので、警告が生成され、null/0として扱われるので、$ diffは単に "negative $ today"です。そして4月31日にはどのようにこの機能が関与していますかそれはどこにも使われていません。プラス3156926を使用して365.25日を返信します。閏年を許すためのおめでとうが、そのような醜い数学を使うためのboooooo。 –

+0

'$ today'は、' strtotime() 'の代わりに' time() 'の戻り値にする必要があります。 – anubhava

答えて

5
function adjustedAge($dob, $adjustTo = 'April 31') { // DOB can be of any format accepted by strtotime() 
    return ((new DateTime($adjustTo.', '.date('Y')))->diff(new DateTime($dob)))->y; 
} 

。これにより、年が取り出されて返されるDateIntervalが返されます。

+0

+1はるかに読みやすく簡単なコードです。 – anubhava

+0

なぜ4月31日ですか? – deceze

+0

@deceze OPが言及した日だったので –

-1

これはかなり簡単です。最初に現在の時刻を取得し、変数に格納します。次に、ミリ秒単位で年齢を取得します(1969年のタイムスタンプが負の値になる前に、3値演算子が使用されていることを考慮してください)。年齢はミリ秒単位になりましたので、単純に必要な一日のタイムスタンプを作成して、特定の日に年齢を取得するには年(60 * 60 * 24 * 365)

function getAge($birth){ 
    $t = time(); 
    $age = ($birth < 0) ? ($t + ($birth * -1)) : $t - $birth; 
    return floor($age/31536000); 
} 

にミリ秒数で割り現在の時刻を使用する代わりにこれは現在の年の4月31日のためにDateTimeオブジェクトを、それを作成し、人が生まれた日付を減算しないものを基本的に

$t = mktime(0, 0, 0, 4, 31, 2012); // <-- April 31st, 2012 
+0

なぜミリ秒ですか? PHPのネイティブタイムスタンプは、1970年1月1日以降の標準UNIX "秒"です。ミリ秒はJavascriptの領域で​​す。同様に、 '$ t +($ birth * -1)'は '$ t - $ birth'と数学的に同じです。あなたの$年齢は$出生の価値にかかわらず同じ値に設定されます。また、閏年を忘れてしまったこともあります。 –

関連する問題