用于计算营业日的PHP类

时间:2013-06-09 03:13:32

标签: php api days

所以我一直在网上搜索试图找到某种PHP API,很好地处理工作日的计算。我在stackoverflow上发现了一些有用的answers and code snippets,但是我发现处理在给定日期添加工作日的代码缺少我需要的某些功能(例如处理周末假期),而且很难根据给定应用程序的需求进行自定义。

所以我最终决定咬紧牙关并编写自己的解决方案。我生成的类包含了我在stackoverflow(James Pasta++)上找到的代码,以及我去年写的类似(和更简单)Java类中使用的逻辑。我在这里发布Q / A风格,以防其他人遇到与此概念相同的挫折,并发现它是一个有用的解决方案。

我解决了两个基本问题 - 1)在提供的日期添加工作日,以及2)计算两个日期之间的工作日。我解决这些问题的主要问题是易用性和可扩展性;有许多地方写得不够有效;如果它成为一个问题,我当然可以重构部分代码,但至少就我的目的而言,我将不会计算未来几千个工作日: - )

示例代码和源代码链接可以在下面的答案中找到。反馈和改进非常受欢迎。

1 个答案:

答案 0 :(得分:0)

The Code

这个库的基本概念是用BusinessDay对象包装日期;然后它可以比较()d与其他日期,或者它可以有工作日add()ed或subtract()ed。提供给库的所有日期可以是以下四种类型之一:strtotime()接受的日期字符串,UNIX时间戳,另一个BusinessDay对象或null(表示当前时间)。

BusinessDay对象可以通过新语句或名为wrapBusinessDay()的函数进行实例化。使用后一个选项允许在实例化时进行方法链接,这可以帮助保持代码简洁。请参阅下面的示例代码。

示例代码:

// add a business day to today
$ship_date = wrapBusinessDay(time())->add(1);

// find # of business days until required date
$required_date = '6/24/2013';
$difference = $ship_date->difference($required_date);

// panic?!
if ($difference < 10) {
    echo "Uh-oh, we'll need expedited shipping!\n";
} else {
    echo "Whew!  we're safe.\n";
}

// specify custom holidays
$arr_matey = wrapBusinessDay('2013-09-18', array(
    '2013-09-19'
))->add(1);

// specify custom formats
echo $arr_matey . "\n";                      // prints '2013-09-20 00:00:00'
echo $arr_matey->dateFormat('m~d~Y') . "\n"; // prints '09~20~2013'

图书馆还有更多内容,但这就是它的要点。希望这能节省一些时间! ~Nate