rovangju/carbon-nbd

Carbon 日期时间扩展,用于计算“下一个工作日”

2.0.0 2020-10-14 06:21 UTC

This package is auto-updated.

Last update: 2024-09-14 14:31:27 UTC


README

Build Status

有需要根据节假日、周末或特殊日期调整的复杂计算的业务逻辑?这个 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 的更改)可能或可能不会导致新的版本标签,具体取决于更改的性质。