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其中一种产生了巨大的数字。

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时间戳

另请注意,我修复了 post 变量名称。

如果开始日期不在 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

在这两种情况下,您都需要一个时间戳-您格式化的一个(作为日期对象)和一个从数据库中获取的...所以我认为您的方法没有错,如果您在两种情况下都获得时间戳...但最后你尝试用 floor 取整数字……当然,如果不到一年,这将导致 0。在不先四舍五入的情况下对其进行测试,并测试您的时间戳,也许那里也有问题?

于 2012-07-16T19:25:39.800 回答