我正在使用PHP日期遇到编码器块。让我先描绘一下我想要发生的事情。例如:
$user_join_date = new DateTime('2015-01-31');
$today_date = new DateTime('2015-04-30');
每天都会运行一个cron,对于此示例,系统将根据过去一个月的订单和数量,每隔31个月(或30个月 - 28日,具体取决于月份)计算该用户的佣金BETWEEN '2015-03-31' AND '2015-04-29'
所以我需要的是两折。首先,我需要确保我在正确的日子计算佣金,即:他们加入日期的月周年或同月的等价物。其次,我需要找到时间框架,我将计算佣金,如上面的mysql snippit所示。
出于显而易见的原因,我不能只是说:
if ($user_join_date->format('d') == $today_date->format('d')){
calc_commission();
}
因为每个月都不会运行。如果我对任何事情都不清楚,请告诉我。
答案 0 :(得分:1)
我认为您说自从注册之日起,您希望在每个用户的整数月内为每个用户提供信用。 MySQL的日期算法的一个方面是非常方便的 - INTERVAL n MONTH
加法。
DATE('2015-01-30') + INTERVAL 1 MONTH ==> '2016-02-28'
DATE('2016-01-30') + INTERVAL 1 MONTH ==> '2016-02-29'
此功能可以解决工作日周围所有奇怪的格里高利历问题,非常好。我打算将续约日期称为日期。
现在,让我们说列signup
包含用户注册时的日期/时间戳。此表达式确定最近的每月续订日期。特别是,如果它等于CURDATE(),则今天是续订日期。
DATE(signup) + INTERVAL TIMESTAMPDIFF(MONTH, DATE(signup), CURDATE()) MONTH
下一步:这个密切相关的(duh!)表达式等于上个月的续约日期。
DATE(signup) + INTERVAL TIMESTAMPDIFF(MONTH, DATE(signup), CURDATE())-1 MONTH
你可以采取CURDATE() - INTERVAL 1 MONTH
,但这对于格里高利月末猴业务来说更为准确。试一试:即使在2016年2月底(闰年)也能正常使用。
现在,您希望在计算中使用从上一个续订日期>=
开始的事务,直到当前续订日期<
之前的一天结束。在MySQL中,按日期范围过滤看起来像这样。
WHERE transdate >= DATE(signup) +
INTERVAL TIMESTAMPDIFF(MONTH, DATE(signup), CURDATE())-1 MONTH
AND transdate < DATE(signup) +
INTERVAL TIMESTAMPDIFF(MONTH, DATE(signup), CURDATE()) MONTH
答案 1 :(得分:0)
$ base_dt是您的加入日期。因此,如果您将其传递给checkIt函数它将相应地提供您的真实或错误今天的日期是结算日。
$base_dt = new DateTime('2015-04-30', new DateTimeZone("America/Chicago"));
if(checkIt($base_dt)) {
echo "true";
//this is the day.
} else {
echo "false";
//this is not the day.
}
所以检查它的功能应该是这样.....
function checkIt($base_dt) {
$base_d = $base_dt->format('j'); //without zeroes
echo $base_d;
$today = new DateTime('now');
$d = $today->format('j');
echo $d;
if($base_d == $d) {
return true;
} else if($base_d>28) {
$base_dt->modify('last day of this month');
$dif_base = $base_dt->format('j') - $base_d;
//echo $dif_base;
$today->modify('last day of this month');
$diff_today = $today->format('j') - $d;
//echo $diff_today;
if(($base_d==31 && $diff_today==0)||($base_d==30 && $diff_today==0 && $d<30)||($base_d==29 && $diff_today==0 && $d<29)) {
return true;
}
if($dif_base==0 && $diff_today==0) {
return true;
}
}
return false;
}