获取每周、每两周和每月日期的方法

Pau*_*ero 1 php laravel laravel-5

用户添加收入或支出。如果他将其归类为经常性交易,他会从包含(每周、每两周、每月)的频率下拉列表中进行选择。用户还输入开始日期。我想获取从用户提供的日期开始选择的频率的日期。

例如,用户输入 06-13-2016 和每周(当前日期:06-28-2016),我想获取日期 06-20-2016 和 06-27-2016。

HTML 下拉菜单

<select name="frequency_id">
    <option value="1">weekly</option>
    <option value="2">fortnightly</option>
    <option value="3">monthly</option>
</select>
Run Code Online (Sandbox Code Playgroud)

控制器

public function getDates($frequency, $start_date) {
    //$start_date is string e.g 06-23-2016
    //$frequency is also string e.g weekly, fortnightly, monthly
    ...
    ...
    return $dates; //array returned
}
Run Code Online (Sandbox Code Playgroud)

如果我将字符串日期转换为 DateTime 对象就可以了,只要我得到日期即可。

我想获取以日期数组或类似形式返回的日期。

我不知道如何继续。请帮忙。

Pau*_*tas 5

您将需要使用Carbon来完成此任务。它已经包含在 Laravel 中。:)

让我们在控制器外部编写一个助手来完成此任务:

app/Helpers/DateHelper.php(只需创建该文件)

<?php
namespace App\Helpers;

use Carbon\Carbon;

class DateHelper
{
    public static function next_dates($start_date, $frequency)
    {
        $dates = [];

        $start_date = Carbon::createFromFormat('m-d-Y', $start_date);
        $end_date = Carbon::today();

        while ($start_date->lte($end_date)) {
            switch ($frequency) {
                case 'weekly':
                    $start_date = $start_date->addWeek();
                    break;
                case 'fortnightly':
                    $start_date = $start_date->addWeeks(2);
                    break;
                case 'monthly':
                    $start_date = $start_date->addMonth();
                    break;
            }

            if ($start_date->lte($end_date)) {
                $dates[] = $start_date->format('m-d-Y');
            }
        }

        return $dates;
    }
}
Run Code Online (Sandbox Code Playgroud)

在你的控制器中,只需使用助手:

<?php
namespace App\Http\Controllers;

use Illuminate\Http\Request;
use Illuminate\Routing\Controller;
use App\Helpers\DateHelper;

class YourController extends Controller
{
     public function index(Request $request)
     {
         $dates = DateHelper::next_dates(
             $request->input('start_date'),
             $request->input('frequency')
         );

         return view('your-view')->with(compact('dates'));
     }
}
Run Code Online (Sandbox Code Playgroud)