讲师中心 微信公众号
AI工具推荐 视频效率加速

计算工作小时数(区分工作日与周六)

阿婷同学_6074

阿婷同学_6074

发布时间:2026-05-01 10:48:01

|

143人浏览过

|

来源于php中文网

原创

计算工作小时数(区分工作日与周六)

本文介绍一种简洁、可扩展的方法,用于按不同规则统计工作日(8小时)和周六(3小时)的总工时,支持自定义节假日排除,适用于php项目中的工时计算场景。

本文介绍一种简洁、可扩展的方法,用于按不同规则统计工作日(8小时)和周六(3小时)的总工时,支持自定义节假日排除,适用于php项目中的工时计算场景。

在实际业务中(如排班系统、外包工时结算或服务SLA计算),常需根据日期类型差异化统计工作时间:例如周一至周五每日标准工时为8小时(含1小时午休),而周六仅开放上午3小时(08:00–11:00),周日及法定节假日不计工时。传统方案往往通过复杂的时间差拆解、边界判断和条件嵌套实现,易出错且难以维护。

以下推荐一种语义清晰、结构解耦、易于扩展的实现方式——基于 DatePeriod 迭代日期,并通过配置驱动工时规则:

✅ 核心设计思路

  • 配置先行:用关联数组明确定义每周各天对应工时('Mon' => 8, 'Sat' => 3, 'Sun' => 0);
  • 日期迭代:利用 DatePeriod 自动遍历起止日期间所有自然日(含起始日,不含结束日);
  • 逐日累加:对每个日期获取星期缩写($date->format('D')),查表取值并累加;
  • 零侵入扩展:如需排除节假日,仅需在循环中增加 in_array($date->format('Y-m-d'), $this->skip_dates) 判断。

? 完整可运行代码

class CountWorkingHours
{
    // 每日工时配置:键为英文星期缩写(Mon-Sun),值为小时数
    public array $hours = [
        'Mon' => 8,
        'Tue' => 8,
        'Wed' => 8,
        'Thu' => 8,
        'Fri' => 8,
        'Sat' => 3,
        'Sun' => 0
    ];

    // 可选:节假日列表,格式为 'YYYY-MM-DD'
    public array $skip_dates = [];

    /**
     * 计算指定时间段内的总工作小时数(按自然日整日计)
     * 注意:此方法默认按“完整工作日”统计,不处理起/止时间在当日中间的情况
     */
    public function get_hours_for_period(string $from, string $to): int
    {
        $start = new DateTime($from);
        $end   = new DateTime($to);

        // DatePeriod 默认包含起始日,不包含结束日(符合“从周四到周六”共3天的语义)
        $period = new DatePeriod(
            $start->modify('today'),
            new DateInterval('P1D'),
            $end->modify('today')
        );

        $totalHours = 0;
        foreach ($period as $date) {
            $dateStr = $date->format('Y-m-d');
            $dayCode = $date->format('D');

            // 跳过节假日或非工作日(如 Sunday 工时为 0,仍会跳过)
            if (in_array($dateStr, $this->skip_dates) || $this->hours[$dayCode] === 0) {
                continue;
            }

            $totalHours += $this->hours[$dayCode];
        }

        return $totalHours;
    }
}

// ✅ 使用示例
$cwh = new CountWorkingHours();
// 示例:2022-04-21(周四)至 2022-04-23(周六)→ Thu(8) + Fri(8) + Sat(3) = 19 小时
$hours = $cwh->get_hours_for_period('2022-04-21 07:00:00', '2022-04-23 16:00:00');
echo $hours; // 输出:19

// ✅ 添加节假日支持
$cwh->skip_dates = ['2022-04-22']; // 周五放假 → 实际计为:Thu(8) + Fri(0) + Sat(3) = 11 小时

⚠️ 注意事项与进阶建议

  • 时间粒度说明:本实现按自然日(date) 统计,不考虑起止时间在当日内的具体时刻(如 2022-04-21 10:00 开始不扣减首日工时)。若需精确到小时级(如扣除午休、截断非工作时段),应补充每日工作时段配置(如 ['start' => '08:00', 'end' => '16:00'])并使用 DateTime::diff() 精确计算交集时长。
  • 时区安全:建议在初始化 DateTime 时显式指定时区(如 new DateTime($from, new DateTimeZone('Asia/Shanghai'))),避免服务器默认时区导致偏差。
  • 性能提示:对于跨年长周期(如5年),DatePeriod 迭代仍高效(O(n)),但若需高频调用,可预生成缓存或改用数据库区间查询优化。

该方案以最小认知成本达成高可读性与强可维护性,是处理差异化工时规则的推荐实践。

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

UP简历
UP简历 Hot

一款AI办公效率工具,主要用于基于AI技术的免费在线简历制作工具,适合需要提升相关任务效率的用户。

咔片AIPPT

一款在线AI演示文稿制作工具,可根据主题和内容需求辅助生成PPT结构与页面,提高演示材料制作效率。

UpDream
UpDream Hot

一款AI视频创作工具,主要用于哔哩哔哩推出的自研AI视频创作工具,适合需要提升相关任务效率的用户。

Seko
Seko Hot

一款AI视频创作工具,主要用于商汤科技推出的创编一体的AI短视频创作Agent,适合需要提升相关任务效率的用户。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

二狗PPT
二狗PPT Hot

一款AI演示文稿工具,主要用于专为中式职场打造的AI PPT生成工具,适合需要提升相关任务效率的用户。

蛙蛙写作

一款AI论文写作工具,主要用于超级AI智能写作助手,适合需要提升相关任务效率的用户。

相关专题

更多
format在python中的用法
format在python中的用法

Python中的format是一种字符串格式化方法,用于将变量或值插入到字符串中的占位符位置。通过format方法,我们可以动态地构建字符串,使其包含不同值。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

1709

2023.07.31

python中的format是什么意思
python中的format是什么意思

python中的format是一种字符串格式化方法,用于将变量或值插入到字符串中的占位符位置。通过format方法,我们可以动态地构建字符串,使其包含不同值。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

1211

2024.06.27

OpenJDK JVM参数怎么调优
OpenJDK JVM参数怎么调优

Java应用运行缓慢,如何调整JVM参数?本专题介绍OpenJDK JVM性能调优的基本流程,涵盖性能指标确认、运行数据采集、内存配置和垃圾回收分析,帮助你先定位瓶颈,再通过对照测试验证效果,避免直接套用参数而影响应用稳定性。

0

2026.10.16

OpenJDK怎么配置Java开发环境
OpenJDK怎么配置Java开发环境

怎样用OpenJDK搭建开发环境?本专题介绍版本选择、下载安装、环境变量配置和编译运行验证,帮助你理清JDK的作用及基本配置流程,并通过简单程序检查环境是否可用,为后续项目开发做好准备。

0

2026.10.16

OpenJDK怎么部署Java应用
OpenJDK怎么部署Java应用

Java项目开发完成后,怎样部署到目标环境并正常运行?本专题介绍OpenJDK应用部署流程,涵盖运行环境准备、版本兼容检查、应用打包、启动参数配置和日志查看,帮助你理清部署前后的操作顺序,减少环境差异造成的运行问题。

0

2026.10.16

Revel框架模板渲染与表单验证
Revel框架模板渲染与表单验证

本专题围绕Revel框架视图层开发,介绍模板语法、变量输出、布局复用、表单提交、参数绑定与验证规则,帮助开发者完成安全规范的页面交互。

0

2026.10.16

Revel框架MVC路由与控制器
Revel框架MVC路由与控制器

本专题聚焦Revel框架MVC核心机制,讲解路由定义、控制器Action、参数绑定、请求响应和反向路由,并结合常见场景梳理接口请求处理流程。

0

2026.10.16

Revel框架入门与安装配置
Revel框架入门与安装配置

本专题从Revel框架环境搭建讲起,系统介绍命令行工具安装、项目创建、目录结构、配置文件及热代码重载,帮助开发者快速完成首个Go Web应用。

0

2026.10.16

Linux 新手先学哪些命令
Linux 新手先学哪些命令

Linux新手命令专题汇集终端基础、文件目录操作、文本查看、软件安装和权限管理等入门文章,帮助按实际任务练习常用命令并建立命令行操作习惯。

0

2026.10.15

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
热门推荐
/
最新课程
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn