【问题标题】:Php Carbon custom time range and judge whether it expiresphp Carbon自定义时间范围及判断是否过期
【发布时间】:2019-10-17 13:36:01
【问题描述】:

说明:

我需要获取从当前日期到接下来 5 天的日期。 并且需要自定义当前时间,并做一些限制

开始日期:

2019-06-01

结束日期:

2019-06-05

每日时间段:

08~10 10~12 12~14 14~16 16~18 18~20

示例 1:

如果当前时间在 2019-06-01 00:00 - 10:00 范围内

结果:

array:2 [▼
  0 => [
    'date' => '2019-06-01',
    "weekstr":"Saturday",
    "subdate":"06-01"
    'timelist' => [
        [
            'period'    => '08 ~ 10', 
            'starthour' => '08',
            'endhour'   => '10',
            'expired'   => false
        ]
        [
            'period'    => '10 ~ 12', 
            'starthour' => '10',
            'endhour'   => '12',
            'expired'   => false
        ]
    ]
  ]
  1 => [
    'date' => '2019-06-02',
    "weekstr":"Saturday",
    "subdate":"06-01"
    'timelist' => [
        [
            'period'    => '08 ~ 10', 
            'starthour' => '08',
            'endhour'   => '10',
            'expire'    => false
        ]
        [
            'period'    => '10 ~ 12', 
            'starthour' => '10',
            'endhour'   => '12',
            'expire'    => false
        ]
    ]
  ]
]

示例 2:

如果当前时间在2019-06-01 10:00 - 11:00范围内

结果:

array:2 [▼
  0 => [
    'date' => '2019-06-01',
    "weekstr":"Saturday",
    "subdate":"06-01"
    'timelist' => [
        [
            'period'    => '08 ~ 10', 
            'starthour' => '08',
            'endhour'   => '10',
            'expire'    => true //Has passed 08:00 - 10:00 has expired, displayed as true
        ]
        [
            'period'    => '10 ~ 12', 
            'starthour' => '10',
            'endhour'   => '12',
            'expire'    => false
        ]
    ]
  ]
  1 => [
    'date' => '2019-06-02',
    "weekstr":"Saturday",
    "subdate":"06-01"
    'timelist' => [
        [
            'period'    => '08 ~ 10', 
            'starthour' => '08',
            'endhour'   => '10',
            'expired'   => false
        ]
        [
            'period'    => '10 ~ 12', 
            'starthour' => '10',
            'endhour'   => '12',
            'expired'   => false
        ]
    ]
  ]
]

总结:要实现这个功能,目前还没有好主意。想寻求帮助,给我一些思路和方法,或者我可以给出一些示例代码供我参考。谢谢。

最新情况

  • 根据Fabián Montero Rodríguez给出的提示,我已经实现了日期处理,但是没有好办法处理时间段。

代码:

$start_date   = Carbon::now();
$end_date     = Carbon::now()->addDays(2);
$date_periods = CarbonPeriod::create($start_date, $end_date);
$dates = [];
foreach ($date_periods as $key => $date){
    $dates[$key]['date']    = $date->format('Y-m-d');
    $dates[$key]['week']    = $date->localeDayOfWeek;
    $dates[$key]['subdate'] = $date->format('m-d');
}
dd($dates);

结果:

array:3 [▼
  0 => array:3 [▼
    "date" => "2019-05-31"
    "week" => "Friday"
    "subdate" => "05-31"
  ]
  1 => array:3 [▼
    "date" => "2019-06-01"
    "week" => "Saturday"
    "subdate" => "06-01"
  ]
  2 => array:3 [▼
    "date" => "2019-06-02"
    "week" => "Sunday"
    "subdate" => "06-02"
  ]
]

当前问题

日期范围已经想好了,但是每个日期时间列表中的时间范围还是没有好办法处理,请求帮助我

【问题讨论】:

  • 所以您正在尝试创建一个带时间的日期范围
  • @Manojkiran.A 是的,有两个部分,日期范围和时间范围。你能帮帮我吗?
  • 检查答案并告诉我是否需要更改

标签: php laravel php-carbon


【解决方案1】:

由于我不清楚您的要求,我在 web.php 中有单独的路由

注意:设置时区时要小心。在config/app.php 中设置错误的时区可能会导致expired 参数变大。

并写了一个闭包函数:

    Route::any('/carbonintervaltest/', function () {
    $startDate   = Carbon::now();
    $endDate     = Carbon::now()->addDays(2);
    $dateRange = CarbonPeriod::create($startDate, $endDate);

    $dates = [];
    foreach ($dateRange as $dateKey =>  $date) {
        $dates[$dateKey]['date']    = $date->format('Y-m-d');
        $dates[$dateKey]['week']    = $date->localeDayOfWeek;
        $dates[$dateKey]['subdate'] = $date->format('m-d');
        $dates[$dateKey]['timelist'] = generateTime($date);
    }
    dd($dates);
});
function generateTime(Carbon $date)
{
    $startOfDay = $date->startOfDay();

    $eightTen = generateTwoHoursDifference($startOfDay, 8);

    $eightTenPeriod = getPeriod($eightTen);
    $tenTwelve = generateTwoHoursDifference($startOfDay, 10);
    $tenTwelvePeriod = getPeriod($tenTwelve);
    $totalTime = [$eightTenPeriod,$tenTwelvePeriod];
    return $totalTime;
}
function getPeriod(array $arrayObCarbonObj)
{
    foreach ($arrayObCarbonObj as $singleCarbonObj) {
        $eachHour[] = $singleCarbonObj->format('H');
    }
    $period = implode(' ~ ', $eachHour);
    $starthour = $eachHour[0];
    $endhour = $eachHour[1];
    $expired = !$arrayObCarbonObj['timeTwo']->isFuture();
    return   [
            'period'    => $period,
            'starthour' => $starthour,
            'endhour'   => $endhour,
            'expired'   => $expired
    ];
}
function generateTwoHoursDifference(Carbon $date, int $start, int $increment = 2)
{
    $dateFirstObj = (new Carbon)->parse($date->toDateTimeString());
    $dateSecondtObj = (new Carbon)->parse($date->toDateTimeString());
    $firstTime = $dateFirstObj->addHours($start);
    $secondTime = $dateSecondtObj->addHours($start+$increment);
    $allTime = ['timeOne' => $firstTime , 'timeTwo' => $secondTime];
    return $allTime;
}

在 web.php 中导入这些类:

use Carbon\Carbon;
use Carbon\CarbonPeriod;

将代码粘贴到web.php文件顶部并打路由

yourapp/carbonintervaltest

因此,如果结果是您要查找的内容,它将给出dd 结果。

如果您不清楚,我已经为此创建了一个 Gist 并粘贴了整个文件。

如果您遇到任何问题,请在下方评论

https://gist.github.com/ManojKiranA/993383025928c285c30db6418e10708b

这里是 dd 结果

array:3 [▼
  0 => array:4 [▼
    "date" => "2019-06-01"
    "week" => "Saturday"
    "subdate" => "06-01"
    "timelist" => array:2 [▼
      0 => array:4 [▼
        "period" => "08 ~ 10"
        "starthour" => "08"
        "endhour" => "10"
        "expired" => true
      ]
      1 => array:4 [▼
        "period" => "10 ~ 12"
        "starthour" => "10"
        "endhour" => "12"
        "expired" => true
      ]
    ]
  ]
  1 => array:4 [▼
    "date" => "2019-06-02"
    "week" => "Sunday"
    "subdate" => "06-02"
    "timelist" => array:2 [▼
      0 => array:4 [▼
        "period" => "08 ~ 10"
        "starthour" => "08"
        "endhour" => "10"
        "expired" => false
      ]
      1 => array:4 [▼
        "period" => "10 ~ 12"
        "starthour" => "10"
        "endhour" => "12"
        "expired" => false
      ]
    ]
  ]
  2 => array:4 [▼
    "date" => "2019-06-03"
    "week" => "Monday"
    "subdate" => "06-03"
    "timelist" => array:2 [▼
      0 => array:4 [▼
        "period" => "08 ~ 10"
        "starthour" => "08"
        "endhour" => "10"
        "expired" => false
      ]
      1 => array:4 [▼
        "period" => "10 ~ 12"
        "starthour" => "10"
        "endhour" => "12"
        "expired" => false
      ]
    ]
  ]
]

【讨论】:

  • 刚上线,非常感谢,我试了报错。
  • 你看到我的要点了吗
  • InvalidArgumentException 尾随数据
  • 测试时设置的时区是什么?
  • 我的时区是亚洲加尔各答
猜你喜欢
  • 1970-01-01
  • 2017-06-20
  • 1970-01-01
  • 2015-10-29
  • 1970-01-01
  • 2016-01-04
  • 1970-01-01
  • 2016-04-23
  • 1970-01-01
相关资源
最近更新 更多