![](/img/trans.png)
[英]Laravel Carbon, how do I get all the dates between two date ranges?
[英]PHP Carbon, get all dates between date range?
如何獲取 PHP 中兩個日期之間的所有日期? 更喜歡使用 Carbon 作為日期。
$from = Carbon::now();
$to = Carbon::createFromDate(2017, 5, 21);
我想要這兩個日期之間的所有日期..但是如何? 只能找到使用 strtotime function 的解決方案。
從 Carbon 1.29 開始,可以執行以下操作:
$period = CarbonPeriod::create('2018-06-14', '2018-06-20');
// Iterate over the period
foreach ($period as $date) {
echo $date->format('Y-m-d');
}
// Convert the period to an array of dates
$dates = $period->toArray();
有關更多詳細信息,請參閱文檔: https : //carbon.nesbot.com/docs/#api-period 。
這是我如何使用Carbon
做到的
private function generateDateRange(Carbon $start_date, Carbon $end_date)
{
$dates = [];
for($date = $start_date->copy(); $date->lte($end_date); $date->addDay()) {
$dates[] = $date->format('Y-m-d');
}
return $dates;
}
由於 Carbon 是 PHP 內置 DateTime 的擴展,您應該能夠使用 DatePeriod 和 DateInterval,就像使用 DateTime 對象一樣
$interval = new DateInterval('P1D');
$to->add($interval);
$daterange = new DatePeriod($from, $interval ,$to);
foreach($daterange as $date){
echo $date->format("Ymd"), PHP_EOL;
}
編輯
如果需要包含期間的最后日期,則需要稍微修改一下,並在生成DatePeriod之前調整$to
$interval = new DateInterval('P1D');
$daterange = new DatePeriod($from, $interval ,$to);
foreach($daterange as $date){
echo $date->format("Ymd"), PHP_EOL;
}
根據 Mark Baker 的回答,我寫了這個函數:
/**
* Compute a range between two dates, and generate
* a plain array of Carbon objects of each day in it.
*
* @param \Carbon\Carbon $from
* @param \Carbon\Carbon $to
* @param bool $inclusive
* @return array|null
*
* @author Tristan Jahier
*/
function date_range(Carbon\Carbon $from, Carbon\Carbon $to, $inclusive = true)
{
if ($from->gt($to)) {
return null;
}
// Clone the date objects to avoid issues, then reset their time
$from = $from->copy()->startOfDay();
$to = $to->copy()->startOfDay();
// Include the end date in the range
if ($inclusive) {
$to->addDay();
}
$step = Carbon\CarbonInterval::day();
$period = new DatePeriod($from, $step, $to);
// Convert the DatePeriod into a plain array of Carbon objects
$range = [];
foreach ($period as $day) {
$range[] = new Carbon\Carbon($day);
}
return ! empty($range) ? $range : null;
}
用法:
>>> date_range(Carbon::parse('2016-07-21'), Carbon::parse('2016-07-23'));
=> [
Carbon\Carbon {#760
+"date": "2016-07-21 00:00:00.000000",
+"timezone_type": 3,
+"timezone": "UTC",
},
Carbon\Carbon {#759
+"date": "2016-07-22 00:00:00.000000",
+"timezone_type": 3,
+"timezone": "UTC",
},
Carbon\Carbon {#761
+"date": "2016-07-23 00:00:00.000000",
+"timezone_type": 3,
+"timezone": "UTC",
},
]
您還可以傳遞布爾值 ( false
) 作為第三個參數以排除結束日期。
這也可以這樣做:
new DatePeriod($startDate, new DateInterval('P1D'), $endDate)
請記住DatePeriod
是一個迭代器,所以如果你想要一個實際的數組:
iterator_to_array(new DatePeriod($startDate, new DateInterval('P1D'), $endDate))
在你使用 Laravel 時,你總是可以創建一個 Carbon 宏:
Carbon::macro('range', function ($start, $end) {
return new Collection(new DatePeriod($start, new DateInterval('P1D'), $end));
});
現在你可以這樣做:
foreach (Carbon::range($start, $end) as $date) {
// ...
}
這是我所擁有的:
private function getDatesFromRange($date_time_from, $date_time_to)
{
// cut hours, because not getting last day when hours of time to is less than hours of time_from
// see while loop
$start = Carbon::createFromFormat('Y-m-d', substr($date_time_from, 0, 10));
$end = Carbon::createFromFormat('Y-m-d', substr($date_time_to, 0, 10));
$dates = [];
while ($start->lte($end)) {
$dates[] = $start->copy()->format('Y-m-d');
$start->addDay();
}
return $dates;
}
例子:
$this->getDatesFromRange('2015-03-15 10:10:10', '2015-03-19 09:10:10');
您可以直接使用碳
$start = Carbon::createFromDate(2017, 5, 21);
$end = Carbon::now();
while($start < $end){
echo $start->format("M");
$start->addMonth();
}
你不能直接使用循環控制變量,接下來必須工作正常
$start = Carbon::today()->startOfWeek();
$end = Carbon::today()->endOfWeek();
$stack = [];
$date = $start;
while ($date <= $end) {
if (! $date->isWeekend()) {
$stack[] = $date->copy();
}
$date->addDays(1);
}
return $stack;
$period = CarbonPeriod::create($start_date,$end_date);
$dates = [];
foreach ($period as $date) {
$dates[] = $date->format('Y-m-d');
}
dd($dates);
我認為如果你使用這個 function 會更好
public static function check_continuous_dates(array $dates): bool
{
$startDate = Carbon::create($dates[0]);
$endDate = Carbon::create(end($dates));
if ($endDate->diffInDays($startDate)+1 == count($dates)) {
return true;
}
return false;
}
非常簡單的解決方案(它適用於舊的 "<1.29" carbon ):
// set $start and $end to any date
$start = Carbon::now()->addDays(-10);
$end = Carbon::now();
$dates = [];
for($i = 0; $i < $end->diffInDays($start); $i++){
$dates[] = (clone $start)->addDays($i)->format('Y-m-d');
}
dd($dates);
本教程將提供 laravel carbon 獲取兩個日期之間所有月份的示例。 一步一步解釋laravel carbon get all月。 這篇文章將為您提供碳獲取日期之間所有月份的簡單示例。 我們將使用獲取兩個日期之間的所有月份 laravel carbon。 在這里,創建一個獲取兩個日期之間的月份的基本示例 laravel。
namespace App\Http\Controllers; use Carbon\Carbon; use Carbon\CarbonPeriod; class SignaturePadController extends Controller { /** * Write code on Method * * @return response() */ public function index() { $result = CarbonPeriod::create('2020-01-01', '2020-12-01'); foreach ($result as $dt) { echo $dt->format("Y-m"); } $dates = $result->toArray(); } }
來源: https : //www.itsolutionstuff.com/post/laravel-carbon-get-all-months-between-two-dates-exampleexample.html
//To get just an array of dates, follow this.
$period = CarbonPeriod::create('2018-06-14', '2018-06-20');
$p = array();
// If you want just dates
// Iterate over the period and create push to array
foreach ($period as $date) {
$p[] = $date->format('Y-m-d');
}
// Return an array of dates
return $p;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.