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

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

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

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

PHP
森林海 2021-06-01 07:09:50
我想我被這個(gè)問題困住了,所以我希望你能給我一些如何解決這個(gè)任務(wù)的想法。我正在開發(fā)一個(gè)應(yīng)用程序,它可以讓您大致了解您的定期付款(我知道,這些東西已經(jīng)存在,這只是一個(gè)副項(xiàng)目)和您的費(fèi)用。API 快要完成了,但我在這部分掙扎:我需要知道在給定的時(shí)間跨度內(nèi)是否需要定期付款。重復(fù)事件(合同)包含其他字段 startDate、endDate、intervalType(枚舉 [每周、每月、每季度、每半年、每年])目前我有這個(gè)作為我的學(xué)說查詢: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é)果并檢查合同是否與時(shí)間范圍相交并注意在此期間發(fā)生的頻率和時(shí)間來實(shí)現(xiàn)。但我不知道我怎么能做到這一點(diǎ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如果我有這個(gè)月的時(shí)間表(2019-05-01 - 2019-05-31),我會(huì)得到這些合同: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 個(gè)月(2019-07-01 - 2019-08-31),我會(huì)得到這個(gè):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 可以實(shí)現(xiàn)嗎?
查看完整描述

1 回答

?
慕村9548890

TA貢獻(xiàn)1884條經(jīng)驗(yàn) 獲得超4個(gè)贊

每周間隔的邏輯在我看來是錯(cuò)誤的。至少在我的銀行應(yīng)用程序中,每周計(jì)劃總是在同一個(gè)工作日,兩次連續(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);

隨著更大的時(shí)期:


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

print_r($result);

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


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

添加回答

舉報(bào)

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

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