第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

獲取日期間隔內(nèi)的重復日期

獲取日期間隔內(nèi)的重復日期

PHP
森林海 2021-06-01 07:09:50
我想我被這個問題困住了,所以我希望你能給我一些如何解決這個任務(wù)的想法。我正在開發(fā)一個應(yīng)用程序,它可以讓您大致了解您的定期付款(我知道,這些東西已經(jīng)存在,這只是一個副項目)和您的費用。API 快要完成了,但我在這部分掙扎:我需要知道在給定的時間跨度內(nèi)是否需要定期付款。重復事件(合同)包含其他字段 startDate、endDate、intervalType(枚舉 [每周、每月、每季度、每半年、每年])目前我有這個作為我的學說查詢:return $this->createQueryBuilder('e')    ->andWhere('e.startDate >= :start')    ->andWhere('e.endDate <= :end')    ->andWhere('e.user = :user')    ->setParameter('start', $start)    ->setParameter('end', $end)    ->setParameter('user', $user)    ->getQuery()    ->getResult();其中參數(shù) start 和 end 是間隔幀。但是我如何檢查合同是否在選定框架內(nèi)到期以及多久到期?Afaik 這只能通過迭代查詢結(jié)果并檢查合同是否與時間范圍相交并注意在此期間發(fā)生的頻率和時間來實現(xiàn)。但我不知道我怎么能做到這一點。示例數(shù)據(jù):[name, intervalType, startDate, endDate, amount]rent, monthly, 2019-01-01, 2020-10-11, -500utility, monthly, 2019-01-01, 2020-10-11, -150salary, monthly, 2019-01-01, 2020-10-11, 1700investment, biannually, 2019-02-10, null , 2500food, weekly, 2019-01-01, null , -50如果我有這個月的時間表(2019-05-01 - 2019-05-31),我會得到這些合同:rent 2019-05-01utility  2019-05-01salary 2019-05-01food 2019-05-01food 2019-05-08food 2019-05-15food 2019-05-22food 2019-05-29如果我選擇以下 2 個月(2019-07-01 - 2019-08-31),我會得到這個:rent 2019-07-01rent 2019-08-01utility  2019-07-01utility  2019-08-01salary 2019-07-01salary 2019-08-01food 2019-07-01food 2019-07-08food 2019-07-15food 2019-07-22food 2019-07-29food 2019-08-01food 2019-08-08food 2019-08-15food 2019-08-22food 2019-08-29investment 2019-08-01DateTime 和 DateInterval 可以實現(xiàn)嗎?
查看完整描述

1 回答

?
慕村9548890

TA貢獻1884條經(jīng)驗 獲得超4個贊

每周間隔的邏輯在我看來是錯誤的。至少在我的銀行應(yīng)用程序中,每周計劃總是在同一個工作日,兩次連續(xù)發(fā)生之間有 7 天。


因此,根據(jù)該邏輯,您可以使用此功能:


function getScheduleBetween($data, $intervalStart, $intervalEnd) {

    $ref = [

        "yearly" => [12, "months"],

        "annually" => [12, "months"],

        "biannually" => [6, "months"],

        "quarterly" => [3, "months"],

        "monthly" => [1, "months"],

        "weekly" => [7, "days"],

        "daily" => [1, "days"]

    ];

    $intervalStart = new DateTime($intervalStart);

    $intervalEnd = new DateTime($intervalEnd);

    $result = [];

    foreach($data as $schedule) {

        // Convert start/end to DateTime

        $startDate = new DateTime($schedule["startDate"]);

        $endDate = $schedule["endDate"] ? min(new DateTime($schedule["endDate"]), $intervalEnd) : $intervalEnd;

        $name = $schedule["name"];

        $interval = $schedule["intervalType"];

        if (!isset($ref[$interval])) throw "Invalid interval type";

        list($coeff, $interval) = $ref[$interval];

        $match = clone $startDate;

        if ($match < $intervalStart) {

            $diff = $intervalStart->diff($match);

            $count = $interval == "days" ? $diff->format("%a") : $diff->m + $diff->y * 12 + ($diff->d ? 1 : 0);

            $count = ceil($count / $coeff) * $coeff;

            $match->modify("+$count $interval");

        }

        while ($match <= $endDate) {

            $temp = clone $match;

            $result[] = ["name" => $name, "date" => $temp->format("Y-m-d")];

            $match->modify("+$coeff $interval");

        }

    }

    array_multisort(array_column($result, "date"), $result);

    return $result;

}

使用示例:


$data = [

    ["name" => "rent", "intervalType" => "monthly", "startDate" => "2019-01-01", "endDate" => "2020-10-11", "amount" => -500],

    ["name" => "utility", "intervalType" => "monthly", "startDate" => "2019-01-01", "endDate" => "2020-10-11", "amount" => -150],

    ["name" => "salary", "intervalType" => "monthly", "startDate" => "2019-01-01", "endDate" => "2020-10-11", "amount" => 1700],

    ["name" => "investment", "intervalType" => "biannually", "startDate" => "2019-02-10", "endDate" => null, "amount" => 2500],

    ["name" => "food", "intervalType" => "weekly", "startDate" => "2019-01-01", "endDate" => null, "amount" => -50],

];


$result = getScheduleBetween($data, "2019-05-01", "2019-05-31");

print_r($result);

隨著更大的時期:


$result = getScheduleBetween($data, "2019-05-01", "2019-08-31");

print_r($result);

如果您有其他類型的間隔,我相信您可以輕松擴展此功能以支持它們,即使使用“每周”的其他邏輯。


查看完整回答
反對 回復 2021-06-04
  • 1 回答
  • 0 關(guān)注
  • 133 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學習伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號