php获取去年范围日期

php获取去年范围日期,php,datetime,Php,Datetime,我在数据库中有一个创建日期为的用户。此用户可以在我的应用程序UI中运行作业,但受一年内运行的作业数量的限制 该用户创建于2014年。我想做一些类似的事情: function runJob($user){ $nbRemainingJob = findReminingJobs($user); if ($nbRemainingJob > 0){ runJob($user); } else { die("no more cred

我在数据库中有一个创建日期为的用户。此用户可以在我的应用程序UI中运行作业,但受一年内运行的作业数量的限制

该用户创建于2014年。我想做一些类似的事情:

function runJob($user){
    $nbRemainingJob = findReminingJobs($user);
    if ($nbRemainingJob > 0){ 
         runJob($user);
    }
    else {
         die("no more credits";)
    }
}
findReminingJobs($user){
      $dateRangeStart = ?; //start date to use
      $endRangeStart = ?; //end date to use
      $sql = "SELECT count(*) FROM jobs WHERE user_id=?";
      $sql .= "AND job_created_at BETWEEN ($dateRangeStart AND $endRangeStart)";
      $res = $pdo->execute($sql, [$user->id]);
      $done = $res->fetchOne();
      return ($user->max_jobs - $done);

}
每个用户的创建生日,$user->max\u作业被重置

问题是如何找到开始/结束日期?换句话说,我想得到一个从用户创建日期开始的日期范围。 例如,如果用户创建日期为2014-04-12,则我的开始日期应为2018-04-12,结束日期应为2019-04-11


有什么想法吗?

首先从数据库中获取用户注册日期,并将其分为年、月和日

$register= explode('-', $userCridate);
$month = $register[0];
$day   = $register[1];
$year  = $register[2];
然后得到当前年份,如

$year = date("Y");
$dateRangeStart = $year."-".$month."-".$day; //start date to use
现在,检查此日期是否大于今天的日期,然后使用去年作为开始日期

$previousyear = $year -1;
$dateRangeStart = $previousyear ."-".$month."-".$day; //start date to use

$endRangeStart = date("Y-m-d", strtotime(date("Y-m-d", strtotime($dateRangeStart)) 
. " + 365 day"));
这是一个想法,检查它是否适合你

$created='2025-04-12';
$date=explode('-',$created);


if($date[0]<date("Y")){
    $newDate=date('Y').'-'.$date[1].'-'.$date[2];
    $dateEnding = strtotime($newDate);
    $dateEnding = date('Y-m-d',strtotime("+1 year",$dateEnding));
}
else{
    $newDate=$created;
    $dateEnding = strtotime($newDate);
    $dateEnding = date('Y-m-d',strtotime("+1 year",$dateEnding));
}


echo 'starting date is: '.$newDate;
echo '</br>';
echo 'ending date is: '.$dateEnding;
输出为:

starting date is: 2018-04-12
ending date is: 2019-04-12
但是为了投入

$created='2025-04-12';
输出是:

starting date is: 2025-04-12
ending date is: 2026-04-12

符合我需要的解决方案:

$now = new DateTime();

    $created_user = date_create($created);

    $diff = $now->diff($created_user)->format('%R%a');
    $diff = abs(intval($diff));
    $year = intval($diff / 365);

    if ($year == 0){
        $startDate=$created_user->format("Y-m-d");
    }else{

        $startDate=$created_user->add(new DateInterval("P".$year."Y"))->format("Y-m-d");
    }
问题在于定义从当前日期到用户创建日期的最大一年范围内的开始日期

因此,如果用户的创建日期早于一年,则比我早+1年,如果不是,则取此日期。开始日期不得大于当前日期\时间


多亏了大家的帮助

我不明白你要应用的逻辑。那么,如果用户是在2014年1月12日创建的,为什么开始日期应该是2018年4月12日?@pr1nc3因为,职位数量有效期为1年。因此,我必须定义从用户创建的日期和月份开始的最后一年是什么。这意味着每个用户的创建生日,最大工作是重置的,我知道,但是如果用户创建于2014-01-12,那么开始日期不应该是2018-01-12,结束日期不应该是2019-01-11?哦,对不起,我的错。这是一个错误。我更新了postAlso如果用户在2025-04-12创建,会发生什么?开始日期将是当前日期,对吗?此方法不起作用。问题是,开始日期是2014年4月12日,如果我使用你的方法,它会给我2015年4月11日,这不是预期的结果。困难在于要找到正确的开始日期,其实没那么简单。同样,复杂的是定义开始日期,而你不能按自己的方式来做。这取决于月/日是否大于、小于或等于当前日期。但是我很感谢你的帮助:)@pr1inc3,谢谢你的回答。我有这个想法,但我认为这里面有一些东西可以做这些事情。我不这么认为。这是你的算法,所以你必须对它应用逻辑。Php有内置函数来帮助您实现这一点,但对于这样的问题,并没有灵丹妙药。我希望我能帮你解决一点问题。你的代码有一个问题,如果创建日期是2014-09-13,这会给我:start\u date=2014-09-13,end_date=2016-09-12我给出了您所说的日期,输出是正确的:开始日期是:2018-09-13结束日期是:2019-09-13我想您遗漏了一些我无法计算2018-09-13之后的工作,因为日期在未来。我修改了你的代码以满足需要,我将在这里发布
function getRange($registrationDate) {
    $range = array();

    // Split registration date components
    list($registrationYear, $registrationMonth, $registrationDay) = explode('-', $registrationDate);
    // Define range start year
    $currentYear = date('Y');
    $startYear = $registrationYear < $currentYear ? $currentYear :     $registrationYear;
    // Define range boudaries
    $range['start'] = "$startYear-$registrationMonth-$registrationDay";
    $range['end'] = date("Y-m-d", strtotime($range['start'] . ' + 364 day'));

    return $range;
}
print_r(getRange('2014-04-12'));

Array
(
    [start] => 2018-04-12
    [end] => 2019-04-11
)

print_r(getRange('2014-09-13'));

Array
(
    [start] => 2018-09-13
    [end] => 2019-09-12
)
$now = new DateTime();

    $created_user = date_create($created);

    $diff = $now->diff($created_user)->format('%R%a');
    $diff = abs(intval($diff));
    $year = intval($diff / 365);

    if ($year == 0){
        $startDate=$created_user->format("Y-m-d");
    }else{

        $startDate=$created_user->add(new DateInterval("P".$year."Y"))->format("Y-m-d");
    }