letsjump/workday-helper-php

使用PHP计算日期范围内的工作日数量并列出假日事件,同时处理公共假日和其他自定义关闭日。

v1.0.0 2021-02-15 09:10 UTC

This package is auto-updated.

Last update: 2024-09-18 15:42:00 UTC


README

Packagist Downloads Packagist License Packagist Version GitHub issues Packagist PHP Version Support Scrutinizer code quality (GitHub/Bitbucket)

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. 计算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)
  1. 计算4月份的工作日数量,同时考虑到星期一、星期三和星期五的公共假日
$closingDays                 = new WorkdayHelper('2021-04-01', '2021-04-30');
$closingDays->workingDays    = [1, 3, 5];
echo $closingDays->getWorkdays(); // (12 days)
  1. 将罢工添加到自定义关闭日
$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)
  1. 获取特定日期间隔的所有关闭日日历
$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>

Gii module

添加自定义关闭日

自定义关闭日是一个事件数组。每个事件都是一个具有此配置的数组

示例

$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
         ],
         ...
      ]

侧注

递归假期和默认日期格式已本地化为意大利。我知道这不是正确的工作方式,但我需要快速为客户开发一个应用程序。如果您想使用您自己的本地化,请参考替换默认递归假期日历。如果您计划在您的应用程序中大量使用,您可能需要扩展基类并在那里配置基本属性。

请将任何错误或愿望报告到相应的问题跟踪器