ThinkPHP5.1两个日期循环怎么只取工作日

老雪同学_2114

老雪同学_2114

2026-08-09

900人浏览

原创

最简单方法是用 date('N', $timestamp) 判断星期几(1=周一,7=周日),跳过6和7;避免用 date('w') 或字符串比较,起始时间需统一转时间戳,ThinkPHP5.1 无内置工作日迭代器,whereTime() 不支持直接筛工作日。

thinkphp5.1两个日期循环怎么只取工作日

PHP 原生循环中跳过周末最简单的方法

直接用 date('N', $timestamp) 判断星期几(1=周一,7=周日),避开 6 和 7 即可。ThinkPHP5.1 本身不提供“工作日迭代器”,得靠自己控制循环逻辑。

常见错误是用 date('w')(0=周日),结果把周日当成 0、周六当成 6,一不小心就把周日当工作日了——尤其容易在跨月或跨年边界出错。

  • date('N') 更安全:返回 1~7,且严格按 ISO-8601,周一始终是 1
  • 别用字符串比较(如 date('D') === 'Mon'),受 locale 影响,本地化环境可能返回中文或其它语言缩写
  • 起始时间必须用 strtotime() 或 DateTime 统一转成时间戳,避免日期字符串隐式转换出错

ThinkPHP5.1 的 Db::name()->whereTime() 不能直接筛工作日

whereTime() 只支持 BETWEEN、>=、 等基础时间范围,不支持函数式条件(比如 WEEKDAY() 或 DAYOFWEEK()),强行写 whereRaw('WEEKDAY(create_time) 虽然能用,但要注意 MySQL 版本兼容性:

  • MySQL 5.7+ 支持 WEEKDAY()(0=周一),但低版本可能不支持
  • 如果用 DAYOFWEEK()(1=周日),逻辑要反过来:只取 2~6(对应周一到周五)
  • 数据库层过滤虽省 PHP 循环,但无法替代 PHP 侧的日期生成逻辑——比如你要生成未来 30 个工作日列表,DB 没法“生成”,只能“筛选已有记录”

封装一个可靠的工作日日期生成器

别反复手写 while + if,抽成函数更稳。注意两个关键点:节假日不处理(那是业务逻辑),只保底排除周六日;且必须支持跨月/跨年自动递进。

btpanel phpsite 宝塔面板PHP网站
btpanel phpsite 宝塔面板PHP网站

宝塔面板 PHP 网站管理:站点创建、删除、启停、PHP 版本切换、域名管理、SSL证书管理、伪静态管理、数据库管理

下载
function getWorkdays($start, $end, $format = 'Y-m-d') {
    $dates = [];
    $ts = strtotime($start);
    $endTs = strtotime($end);
    while ($ts <p>调用示例:<code>getWorkdays('2024-04-01', '2024-04-10')</code> 返回 8 个日期(去掉 4月6日、4月7日)。别用 <code>DateTime::modify('+1 day')</code> 链式调用,某些 PHP 版本在月末会有跳日 bug。</p><h3>两个日期循环嵌套时怎么避免重复计算周末</h3><p>如果你真在写双重循环(比如外层遍历月份,内层遍历该月所有天),最容易犯的错是:内层没重置起止时间,或外层用 <code>date('t')</code> 获取天数后硬写 <code>for ($i=1; $i,导致日期拼接出错(如 <code>"2024-02-30"</code> 被 PHP 自动转成 3月1日,然后你又对这个错位日期判 weekday)。</code></p>
  • 统一用时间戳推进,不用字符串拼接日期
  • 外层循环用 DateTime 控制月初/月末,内层用 $date->modify('+1 day') 但必须配合 $date->format('Y-m-d') 校验是否仍在当月
  • 更稳妥的做法:先用单层循环生成完整工作日数组,再按需分组——双重循环在这里纯属过早优化,反而增加出错概率

真正难的不是跳过周末,而是后续要叠加法定节假日排除逻辑。那个得查表或调 API,和“工作日”不是同一维度的事——先跑通纯周一到周五再说。

php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!

相关文章

PHP速学教程(入门到精通)
PHP速学教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

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

相关专题

更多
Docker Desktop怎么设置端口映射
Docker Desktop怎么设置端口映射

本专题聚焦Docker Desktop容器端口映射与访问配置,整理从创建容器、设置端口绑定到验证本地服务访问的操作流程。针对端口被占用、映射配置错误、容器服务无法访问等情况,也提供相应的检查方向,方便用户完成端口配置。

2026.11.03

0

18

Docker Desktop镜像构建教程
Docker Desktop镜像构建教程

想使用Docker Desktop将本地项目构建成Docker镜像?本专题围绕镜像构建的实际操作展开,介绍Dockerfile编写、构建命令使用、镜像标签设置和构建日志查看等内容,同时整理镜像无法生成、依赖安装失败及构建缓存异常等问题的排查思路。

2026.11.03

0

11

Docker Desktop容器创建指南
Docker Desktop容器创建指南

本专题聚焦Docker Desktop容器创建与运行配置,介绍通过本地镜像或远程镜像创建容器的方法,以及容器启动、终端访问、日志查看和基础管理等操作。针对端口冲突、参数配置不当、容器无法启动等情况,也整理了相应的排查方向。

2026.11.03

0

11

Tailwind CSS 如何制作导航栏和卡片
Tailwind CSS 如何制作导航栏和卡片

用 Tailwind CSS 制作导航栏和卡片,可先搭建语义化结构,再组合 Flex、Grid、间距、圆角与阴影类。这里整理横向导航、移动端菜单、卡片网格及悬停效果的相关文章,帮助你把常见页面组件做得清晰且适配不同屏幕。

2026.11.03

0

17

Tailwind CSS 响应式布局怎么写
Tailwind CSS 响应式布局怎么写

Tailwind CSS 响应式布局通常从移动端样式写起,再用 sm、md、lg 等前缀调整不同屏幕宽度下的网格、间距和导航。本专题整理断点配置、Grid 与 Flex 自适应布局及常见溢出问题,帮助你逐步完成多设备适配。

2026.11.03

0

19

Tailwind CSS 常用类名怎么记
Tailwind CSS 常用类名怎么记

Tailwind CSS 类名很多,先按布局、间距、文字、颜色和状态分组记忆,再通过官方文档检索具体写法。本专题结合类名排序、动态拼接失效、自定义实用类等问题,帮助你建立常用类名的速查方法。

2026.11.03

0

12

码上飞入口地址合集
码上飞入口地址合集

本专题汇总了码上飞(CodeFlying)的官方入口地址合集,涵盖官网主站及网页版在线使用入口,支持注册登录后直接在线体验零代码AI应用生成。同时整理了APP端下载渠道与小程序入口,助你快速访问平台,通过自然语言描述需求即可生成应用、小程序或网站。

2026.11.03

0

10

Uvicorn 报错与问题解决教程
Uvicorn 报错与问题解决教程

本专题汇总了Uvicorn服务器常见问题与报错解决的教程合集,涵盖启动失败、端口占用、模块导入错误、事件循环冲突及热重载失效等典型故障的排查思路。同时整理了多进程与Worker配置、SSL/HTTPS证书报错、跨域与代理配置等实战解决方案,助你快速定位并解决Uvicorn运行中的各类问题。

2026.11.02

20

14

Uvicorn使用教程
Uvicorn使用教程

本专题汇总了Uvicorn使用教程与启动运行指南,涵盖其作为Python ASGI服务器的定位与特点,以及命令行启动(uvicorn main:app --reload)、参数配置(host/port/workers)、程序内嵌运行与Gunicorn结合部署等核心用法。同时整理了热重载调试、日志配置与生产环境部署优化等技巧,助你快速掌握Uvicorn的运行与配置。

2026.11.02

40

17

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
墨刀帮助中心
墨刀帮助中心

共0课时 | 0人学习

MyEclipse学习中心
MyEclipse学习中心

共0课时 | 0人学习

Apache Subversion 官方手册
Apache Subversion 官方手册

共0课时 | 0人学习