如果用户注册时间超过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>';
}
?>
答案 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";