有条件的,如果strtotime的注册日期超过x个月的逻辑

时间:2017-04-08 13:48:38

标签: php date time strtotime

如果用户注册时间超过x个月,我想显示一条消息。

我打算通过使用strtotime获取注册日期和当前日期,然后查看注册日期是否小于当前日期减去月份来实现此目的。

以下结果是注册超过3个月'但注册日期不到3个月。

如果有助于找到答案,请随意重新排列逻辑。

<?php

$registered_date = strtotime( date( 'ymd', strtotime('2017-04-01 10:39:45') ) );
$current_date = strtotime( date( 'ymd' ) );
$months = '3';
$current_date_minus_months = strtotime( '-' . $months . ' months' , $current_date);

echo '<p>Registered Date: ' . $registered_date . '</p>';
echo '<p>Current Date: ' . $current_date . '</p>';
echo '<p>Current Date Minus Months: ' . $current_date_minus_months . '</p>';

if ( $current_date_minus_months < $registered_date ) {
    echo '<p>Registered for more than 3 months</p>';
} else {
    echo '<p>Registered for less than 3 months</p>';
}

?>

2 个答案:

答案 0 :(得分:1)

使用Php Datetime课程来处理日期会更好。在您的情况下,它将如下所示:

<?php

$registered_date = new Datetime('2017-04-01 10:39:45');
$current_date = new Datetime();
$months = '3';
$diff = $current_date->diff($registered_date);

echo '<p>Registered Date: ' . $registered_date . '</p>';
echo '<p>Current Date: ' . $current_date . '</p>';
echo '<p>Month diff: ' . $diff->m . '</p>';

if (  $diff->y > 0 || $diff->m >= $months) {
    echo '<p>Registered for more than 3 months</p>';
} else {
    echo '<p>Registered for less than 3 months</p>';
}

?>

答案 1 :(得分:1)

你的第一行核心已经给出了第一个问题:

$registered_date = strtotime( date( 'ymd', strtotime('2017-04-01 10:39:45') ) );

以下代码:

date('ymd', strtotime('2017-04-01 10:39:45'))

170401中的结果。然后再将其提供给strtotime()。这个 可能被解析为17:04:01,意思是今天下午5点在你当地 时区。事实是:strtotime已经转换为Unix时间戳, 所以转换日期字符串没有意义(2017-04-01 10:39:45) 对于这种格式,然后将其转换回date,然后再转回 Unix与另一个strtotime电话。

然后,你也有一个相反的逻辑:如果当前日期减去3个月 事件发生在注册日期之后,即用户 注册时间为3个月或更长。但这条线却恰恰相反:

if ( $current_date_minus_months < $registered_date ) {

使用>=或切换变量。

此外,保存当前日期的唯一一点是您使用它 你3个月前的计算。但是使用当前时间作为第二个 参数是默认值,因此您不需要它。

清理代码,我们有:

<pre><?php

$months = 3;

$registered_date = strtotime('2017-04-01 10:39:45');
$current_date_minus_months = strtotime("-$months months");

# for your debugging
print_r([
    'registered_date'      => $registered_date,
    'current_date'         => time(),
    'current_minus_months' => $current_date_minus_months,
]);

if ( $registered_date < $current_date_minus_months )
    echo "Registered for more than 3 months\n";
else
    echo "Registered for less than 3 months\n";

无论如何,更好的方法是使用DateTime 接口,面向对象,如另一个答案中所述。这是 另一种方式:

$months = 3;

$current    = new DateTime();
$registered = new DateTime('2017-01-01 10:39:45');
$threshold  = $current->sub(new DateInterval('P' . $months . 'M'));

if ($registered <= $threshold)
    echo "more or equal to $months months";
else
    echo "less than $months months";