0

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

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

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

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

4

1 回答 1

0

编码

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

BusinessDay 对象可以通过 new 语句或称为 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'

图书馆还有更多内容,但这就是它的要点。希望这会节省其他人一些时间!〜内特

于 2013-06-09T03:13:32.403 回答