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

时间:2016-06-28 04:45:20

标签: php laravel laravel-5.2

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

例如,用户输入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>

控制器

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
}

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

我想在一系列日期或类似日期中返回日期。

我不知道如何处理它。请帮忙。

2 个答案:

答案 0 :(得分:2)

您希望使用Carbon执行此任务。它已经包含在Laravel中。 :)

让我们在控制器外编写一个帮助程序来执行此任务:

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

<?php
namespace App\Helpers;

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;
    }
}

在您的控制器中,只需使用帮助程序:

<?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'));
     }
}

答案 1 :(得分:0)

您可以使用以下内容:

function getDates($frequency, $start_date, $end_date = null) {
    //$start_date is string e.g 06-23-2016
    //$frequency is also string e.g weekly, fortnightly, monthly
    //$end_date is optional string: limit to the dates to be generated. Default = today

    // Convert to use slashes, so PHP will interpret in m/d/Y format,
    // otherwise it would expect d-m-Y.
    $dt = new DateTime(str_replace("-", "/", $start_date));
    $dtUntil = new DateTime(str_replace("-", "/", $end_date ? $end_date : date("m-d-Y")));
    // conversion table: frequency to date modifier string
    $modifiers = [
        "weekly" => "+1 week",
        "fortnightly" => "+2 weeks",
        "monthly" => "+1 month"
    ];
    $modifier = $modifiers[$frequency];
    $dt->modify($modifier);
    while($dt <= $dtUntil) {
        $dates[] = $dt->format("m-d-Y");
        $dt->modify($modifier);
    }
    return $dates; //array returned
}

示例电话:

$dates = getDates("weekly", "06-13-2016", date("m-d-Y"));

你需要提供一些结束数组的东西,所以我提供了生成日期的结束日期,作为函数的第三个参数。如果你不提供它,它将默认为今天,所以在上面的例子中它可能被省略。

eval.in上看到它。