rovangju / carbon-nbd
Carbon 日期时间扩展,用于计算“下一个工作日”
2.0.0
2020-10-14 06:21 UTC
Requires
- php: >=7.1.0
- nesbot/carbon: ~2.0
Requires (Dev)
- apigen/apigen: ~2.0
- nette/nette: ~2.1.3
- phpunit/phpunit: ~6.0
This package is auto-updated.
Last update: 2024-09-14 14:31:27 UTC
README
有需要根据节假日、周末或特殊日期调整的复杂计算的业务逻辑?这个 PHP Carbon 项目(本身就是一个 DateTime 扩展)的包装器正是为你准备的!
概述
该实用工具的基本原理是根据提供的日期执行基于日期的逻辑,以确定“下一个工作日”。有各种方法可以添加复杂性,以补充节假日和截止日期。
主要的“精华”功能由 nbd(Carbon $c)
方法提供。该方法将通过检查各种标准并在循环中递增一天来执行其检查程序。nbd()
方法将返回一个更新的 Carbon::
对象,其日期设置为适当的工作日。
请注意:这仅适用于日期逻辑.
基本用法
use CarbonExt\NBD\Calculator; use CarbonExt\NBD\CoreCallbacks C; use Carbon\Carbon; $nbd = new Calculator(); /* Date to find the next business day for */ $dt = new Carbon('2014-01-01'); /* Cherry pick special dates */ $nbd->addExclusion(new Carbon('2014-01-02')); var_dump($nbd->nbd($dt)); /* Carbon obj: 2014-01-03 */
回调支持
/* Custom exclusion callbacks for layering in complexity */ $nbd->addCallback(C::noWeekends()); $nbd->addCallback(C::ignoreDaysOfWeek(array(4))); /* No Fridays, uses Carbon's 0-based offsets */ /* All callback functions must accept a Carbon object and return a bool value */ $cfn = function(Carbon $dt) { return ($dt->day % 2 == 0); } $nbd->addCallback($cfn); /* Only on even days of the month */
截止日期支持
例如,你想允许今天下午 3:00 前提交的付款当天生效。如果付款是在下午 3:00 后提交的,则它不会在当天生效,而是要到下一个工作日...
注意:截止日期仅基于小时逻辑有效;传入 setDeadline() 的日期不予考虑!
$nbd->setDeadline(new Carbon('3:00pm')); $nbd->nbd(new Carbon('2014-01-01 2:59:59pm')); /* Carbon obj: 2014-01-01 00:00:00 */ $nbd->nbd(new Carbon('2014-01-01 3:00:01pm')); /* Carbon obj: 2014-01-02 00:00:00 */
通过扩展的更完整的使用案例...
use CarbonExt\NBD\Calculator; use CarbonExt\NBD\CoreCallbacks as C; use Carbon\Carbon; class BusinessDayCalc extends Calculator { protected $observedHolidays = array( 'January 1st', /* New years */ 'July 4th', /* Independence Day */ 'November 28th', /* Thanksgiving */ 'December 25th', /* Christmas */ ); public function __construct() { $this->addCallback(C::noWeekends()); $observed = array(); /* Use ignoreRecurring strategy to ignore recurring month-day combos */ foreach ($this->observedHolidays as $dt) { $observed[] = new Carbon($dt); } $this->addCallback(C::ignoreRecurring($observed)); /* Use ignoreNDOW strategy to ignore complex, verbal-oriented exceptions */ /* Ignore Memorial Day: Last Monday of May */ $this->addCallback(C::ignoreNDOW(5, -1, 1)); /* Ignore Labor Day: First Monday of September */ $this->addCallback(C::ignoreNDOW(9, 1, 1)); } } $nbd = new BusinessDayCalc(); /* Now all your business use-case rules are automatically built in */
贡献
请遵循 Git Flow 规范。建议应在 develop 或 feature/bugfix/support 分支上进行,以便维护者合并。
版本发布遵循 语义化版本控制 2.0.x 指南。分钟调整(例如:对 README.md 的更改)可能或可能不会导致新的版本标签,具体取决于更改的性质。