1

2 つの日付間の年数を計算したい。それらの 1 つはデータベースから取得され、もう 1 つは日付形式のユーザー入力から取得されます。

このコードを使用して、ユーザーから日付を取得しました。

$today   = $_POST['to-day'];
$tomonth = $_POST['to-month'];
$toyaer  = $_POST['to-year'];
$dateto  = date("$toyaer-$tomonth-$today");

そして、データベースから取得したものを使用して計算した方法は次のとおりです。

$start      = $leaveresult['date']; // i took from database 
$end        = strtotime($dateto);   
$difference = abs($end - $start);
$years      = floor($difference / (60*60*24*365));

問題は、得られる結果が常に0.

私はさまざまな方法を試しましたが、それらのすべてが結果になり、0そのうちの1つは膨大な数になりました。

4

3 に答える 3

3

これはテストされていませんが、次のように機能すると思います。

$today = $_POST['to-day'];
$tomonth = $_POST['to-month'];
$toyear = $_POST['to-year'];
$dateto = "$toyear-$tomonth-$today";

$start = $leaveresult['date'];// i took from database 
$end = strtotime($dateto);   
$difference = abs($end - $start);
$years = floor($difference / (60*60*24*365));

$leaveresult['date']UNIXタイムスタンプだと思います

また、投稿変数名を修正したことに注意してください。

開始日がUNIXタイムスタンプにない場合は、

$start = strtotime($leaveresult['date']);// i took from database 
于 2012-07-16T19:01:40.873 に答える
2

DateTimeクラスは、 diffメソッドを提供することで、これらすべてを簡素化します。これにより、探している値を取得できるDateIntervalオブジェクトが返されます。

次のように仮定$_POSTします。

$_POST = array(
    'to-year' => 2010,
    'to-month' => 8,
    'to-day' => 22
);

$leaveresult['date']のようになります。

$leaveresult = array(
    'date' => date('Y-m-d H:i:s', strtotime('-5 years')));

あなたはこのようなことをすることができます...

$input_date = new DateTime(sprintf("%d-%d-%d", $_POST['to-year'], $_POST['to-month'], $_POST['to-day']));
$database_date = new DateTime($leaveresult['date']);

$diff = $database_date->diff($input_date);

echo $diff->format('%r%y years') . PHP_EOL;
echo $diff->format('%r%m months') . PHP_EOL;
echo $diff->format('%r%d days') . PHP_EOL;

$years = $diff->y;

どちらが得られますか

3 years
1 months
5 days  

そして$years等しくなります3

于 2012-07-16T19:32:04.180 に答える
1

どちらの場合もタイムスタンプが必要です-フォーマットしたもの(日付オブジェクトとして)とデータベースから取得したもの...両方の場合でタイムスタンプを取得する場合、アプローチは間違っていなかったと思います...しかし、最後に数値を下限で四捨五入しようとしました...もちろん、1年未満の場合、これは0になります。最初に丸めずにテストし、タイムスタンプをテストします。何か問題があるのでしょうか?

于 2012-07-16T19:25:39.800 に答える