letsjump / workday-helper-php
使用PHP计算日期范围内的工作日数量并列出假日事件,同时处理公共假日和其他自定义关闭日。
Requires
- php: >=5.6
README
WorkdayHelper
使用PHP计算日期范围内的工作日数量并列出假日事件,同时处理公共假日和其他自定义关闭日。
灵感来源于 Massimo Simonini 的 getWorkdays() Gist。@see https://gist.github.com/massiws/9593008
优点和特性
- 可以指定一周内的工作日范围(从星期一到星期日);
- 可以添加自定义假日和商业关闭日,例如数据库查询的结果;
- 返回特定日期范围内的假日日历;
- 可以使用自定义递归假日日历(见
$publicHolidays
); - 处理应用程序时区;
- 自动计算复活节,并处理时区(需要带有
ext-calendar
的PHP);
需求
PHP 5.6.0 及更高版本
Composer
通过 Composer 安装此扩展是首选方式。
运行
composer require --prefer-dist letsjump/workday-helper-php
或添加
"letsjump/workday-helper-php": "~1.0.0"
到你的 composer.json 文件的 require
部分。
手动安装
如果你不希望使用 Composer,你可以下载 最新版本。
require_once('/path/to/workday-helper-php/WorkdayHelper.php');
依赖
PHP ext-calendar
为了自动计算复活节日期,你必须使用 --enable-calendar
编译PHP。见 ext-calendar。如果你处于Docker环境中,可以参考 这个 Stack Overflow 问题。
如果你的PHP没有编译ext-calendar,且无法编译,请将 $calculateEaster
设置为 false
,否则 WorkingdayHelper 将抛出异常。
用法
- 计算1月份的工作日数量,同时考虑到公共假日
use letsjump\workdayHelper\WorkdayHelper; $closingDays = new WorkdayHelper('2021-01-01', '2021-01-31'); $closingDays->workingDays = [1, 2, 3, 4, 5]; echo $closingDays->getWorkdays(); // (19 days)
- 计算4月份的工作日数量,同时考虑到星期一、星期三和星期五的公共假日
$closingDays = new WorkdayHelper('2021-04-01', '2021-04-30'); $closingDays->workingDays = [1, 3, 5]; echo $closingDays->getWorkdays(); // (12 days)
- 将罢工添加到自定义关闭日
$closingDays = new WorkdayHelper('2021-01-01', '2021-01-31'); $closingDays->workingDays = [1, 2, 3, 4, 5]; $closingDays->customClosing = [ [ 'date' => '2021-01-18', 'event' => 'Strike!', 'options' => [ 'employee_id' => 345, 'htmlClass' => 'deep-purple' ] ], ]; echo $closingDays->getWorkdays(); // (18 days)
- 获取特定日期间隔的所有关闭日日历
$closingDays = new WorkdayHelper('2021-01-01', '2021-12-31'); $closingDays->workingDays = [0, 1, 2, 3, 4, 5, 6]; // don't forget to set every day of the week! <table> <?php foreach ($closingDays->getCalendar() as $holiday): ?> <tr> <td><?= $holiday['date'] ?></td> <td><?= $holiday['event'] ?></td> </tr> <?php endforeach ?> </table>
添加自定义关闭日
自定义关闭日是一个事件数组。每个事件都是一个具有此配置的数组
示例
$myInstantatedClass->customClosing = [ [ 'date' => '2021-01-10', 'event' => 'Chiusura per ferie' ], [ 'date' => '2021-01-05', 'event' => 'Strike!', 'options' => [ 'id' => 345, 'htmlClass' => 'green' ] ], ... ];
替换默认递归假日日历
默认递归假日日历是一个事件数组。每个事件都是一个具有此配置的数组
示例
$myInstantatedClass->publicHolidays = [ [ 'm-d' => '12-25', 'event' => 'Christmas' ], [ 'm-d' => '12-26', 'event' => 'Boxing day', 'options' => [ 'id' => 345, 'htmlClass' => 'green' ] ], ... ];
假日日历
假日日历返回给定日期范围内工作日的假日列表。因此,如果你想检索该日期范围内的所有关闭日,你应该将一周中的所有天都设置到 $workingDays 数组中,例如:$myWorkDay->workingDays[0,1,2,3,4,5,6]。
输出是一个事件数组。每个数组以假日的时间戳为键,并包含
示例
[ [1609455600] => [ [unixTimestamp] => 1609455600, [date] => 2021-01-01, # control the format with $outputFormat property [event] => Capodanno, # description of the event [type] => public, #public / custom [options] => # custom option passed by the $customClosing or the $publicHolidays Array ], ... ]
侧注
递归假期和默认日期格式已本地化为意大利。我知道这不是正确的工作方式,但我需要快速为客户开发一个应用程序。如果您想使用您自己的本地化,请参考替换默认递归假期日历。如果您计划在您的应用程序中大量使用,您可能需要扩展基类并在那里配置基本属性。
请将任何错误或愿望报告到相应的问题跟踪器