有办法在Carbon中跳过特定的日子吗?

问题描述 投票:0回答:1

我有一个计算运输天数的方法。我需要能够添加天到一个Carbon实例,但我需要跳过添加一天的基础上,如果它的一个特定的日子的一周,不一定是周六周日,它可以是周一或周二以及。我似乎在Carbon文档中找不到任何东西,指定在添加天数时将一周中的某些日子列入黑名单。

php php-carbon
1个回答
0
投票

Carbon的一个库可以帮助设置一周内的开闭日,所以你可以。

https:/github.comkylekatarnlsbusiness-time。

而且你可以做。

BusinessTime::enable(Carbon::class, [
  'monday'.   => [],
  'tuesday'   => ['00:00-24:00'],
  'wednesday' => ['00:00-24:00'],
  'thursday'  => ['00:00-24:00'],
  'friday'    => [],
  'saturday'  => ['00:00-24:00'],
  'sunday'    => ['00:00-24:00'],
]);

$date = Carbon::parse('2019-06-01');

echo $date->addOpenTime('4 days');

这样加4天,跳过周五和周一。

你用一个循环一个循环地加天数,基本可以得到同样的结果,但由于间隔时间大,所以会很慢。为了优化操作,你应该先添加完整的周数。

$daysToAdd = 36;
$skippedDays = ['Monday', 'Friday'];
$daysPerWeek = 7 - count($skippedDays);
$completeWeeks = floor($daysToAdd / $daysPerWeek);

function skip(CarbonInterface $date, array $skippedDays): CarbonInterface {
  $date = $date->copy(); // if not using CarbonImmutable

  while (in_array($date->format('l'), $skippedDays)) {
    $date = $date->addDay();
  }

  return $date;
}

$start = Carbon::now(); // Or whatever date
$end = $start->copy()->addWeeks($completeWeeks); // ->copy() not needed if you use CarbonImmutable
$end = skip($end, $skippedDays);

// For each remaining days
for ($i = $daysToAdd % $daysPerWeek; $i--; $i > 0) {
  $end = skip($end->addDay(), $skippedDays);
}

这是一个适用于你的特殊情况的普通版本,但如果你认为有一天,你将不得不处理小时-时间间隔-小时-精度的问题,而不是天数,或者将有特殊的日子(比如节假日例外),那么你一定要使用 "完整周"。cmixin/business-time (以上链接)。

© www.soinside.com 2019 - 2024. All rights reserved.