首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >有没有办法跳过碳排放中的特定日子?

有没有办法跳过碳排放中的特定日子?
EN

Stack Overflow用户
提问于 2020-06-03 01:34:48
回答 1查看 155关注 0票数 0

我有一个计算送货天数的方法。我需要能够在Carbon实例上添加天数,但我需要跳过根据一周中的特定日期添加日期,而不一定是周六/周日,也可以是周一或周二。我似乎找不到任何碳文件,指定黑名单中的某些日子,一周中添加天数。

EN

回答 1

Stack Overflow用户

发布于 2020-06-04 17:11:22

Carbon库可帮助您在一周内设置开放/关闭日期,因此您可以:

https://github.com/kylekatarnls/business-time

你可以这样做:

代码语言:javascript
复制
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天跳过星期五和星期一。

一个循环一个接一个地添加天数,基本上可以得到相同的结果,但它会很慢,因为间隔很大。要优化操作,应首先添加完整的周数:

代码语言:javascript
复制
$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 (上面的链接)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62157953

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档