当前位置: 首页 > news >正文

PHP 生成当月日期

 一:按日期顺序排列的数组,而不是按周分组的二维数组


/*日期生成
*day: 日期数字
*date: 完整的日期字符串 (YYYY-MM-DD)
*is_current_month: 是否属于当前月份
*is_prev_month: 是否是上个月的日期
*is_next_month: 是否是下个月的日期
*is_today: 是否是今天
*/
function generateFullCalendar($year = null, $month = null) {// 如果没有提供年份和月份,则使用当前年月$year = $year ?? date('Y');$month = $month ?? date('m');// 获取本月的第一天$firstDayOfMonth = date('Y-m-01', strtotime("$year-$month-01"));// 获取本月的第一天是星期几(0-6,0表示周日)$firstDayOfWeek = date('w', strtotime($firstDayOfMonth));// 获取本月的总天数$daysInMonth = date('t', strtotime($firstDayOfMonth));// 获取上个月的天数$prevMonthDays = date('t', strtotime('-1 month', strtotime($firstDayOfMonth)));// 计算需要显示的上个月日期(补全第一周)$calendar = [];for ($i = $firstDayOfWeek - 1; $i >= 0; $i--) {$day = $prevMonthDays - $i;$prevMonth = date('m', strtotime('-1 month', strtotime($firstDayOfMonth)));$prevYear = date('Y', strtotime('-1 month', strtotime($firstDayOfMonth)));$calendar[] = ['day' => $day,'date' => sprintf("%04d-%02d-%02d", $prevYear, $prevMonth, $day),'is_current_month' => false,'is_prev_month' => true,'is_next_month' => false,'is_today' => false];}// 添加本月的日期for ($day = 1; $day <= $daysInMonth; $day++) {$date = sprintf("%04d-%02d-%02d", $year, $month, $day);$calendar[] = ['day' => $day,'date' => $date,'is_current_month' => true,'is_prev_month' => false,'is_next_month' => false,'is_today' => ($date == date('Y-m-d'))];}// 计算需要显示的下个月日期(只补全最后一周)$totalDaysDisplayed = count($calendar);$daysNeededToCompleteLastWeek = (7 - ($totalDaysDisplayed % 7)) % 7;if ($daysNeededToCompleteLastWeek > 0) {for ($day = 1; $day <= $daysNeededToCompleteLastWeek; $day++) {$nextMonth = date('m', strtotime('+1 month', strtotime($firstDayOfMonth)));$nextYear = date('Y', strtotime('+1 month', strtotime($firstDayOfMonth)));$calendar[] = ['day' => $day,'date' => sprintf("%04d-%02d-%02d", $nextYear, $nextMonth, $day),'is_current_month' => false,'is_prev_month' => false,'is_next_month' => true,'is_today' => false];}}return $calendar;
}

 二:按周分组的二维数组

/*日期生成
*day: 日期数字
*date: 完整的日期字符串 (YYYY-MM-DD)
*is_current_month: 是否属于当前月份
*is_prev_month: 是否是上个月的日期
*is_next_month: 是否是下个月的日期
*is_today: 是否是今天
*/
function generateFullCalendar($year = null, $month = null) {// 如果没有提供年份和月份,则使用当前年月$year = $year ?? date('Y');$month = $month ?? date('m');// 获取本月的第一天和最后一天$firstDayOfMonth = date('Y-m-01', strtotime("$year-$month-01"));$lastDayOfMonth = date('Y-m-t', strtotime("$year-$month-01"));// 获取本月的第一天是星期几(0-6,0表示周日)$firstDayOfWeek = date('w', strtotime($firstDayOfMonth));// 获取本月的总天数$daysInMonth = date('t', strtotime($firstDayOfMonth));// 获取上个月的天数$prevMonthDays = date('t', strtotime('-1 month', strtotime($firstDayOfMonth)));// 计算需要显示的上个月日期(补全第一周)$prevMonthDates = [];for ($i = $firstDayOfWeek - 1; $i >= 0; $i--) {$day = $prevMonthDays - $i;$prevMonth = date('m', strtotime('-1 month', strtotime($firstDayOfMonth)));$prevYear = date('Y', strtotime('-1 month', strtotime($firstDayOfMonth)));$prevMonthDates[] = ['day' => $day,'date' => sprintf("%04d-%02d-%02d", $prevYear, $prevMonth, $day),'is_current_month' => false,'is_prev_month' => true,'is_next_month' => false];}// 计算本月的日期$currentMonthDates = [];for ($day = 1; $day <= $daysInMonth; $day++) {$currentMonthDates[] = ['day' => $day,'date' => sprintf("%04d-%02d-%02d", $year, $month, $day),'is_current_month' => true,'is_prev_month' => false,'is_next_month' => false,'is_today' => ($day == date('j') && $month == date('m') && $year == date('Y'))];}// 计算需要显示的下个月日期(只补全最后一周)$totalDaysDisplayed = count($prevMonthDates) + $daysInMonth;$daysNeededToCompleteLastWeek = (7 - ($totalDaysDisplayed % 7)) % 7;$nextMonthDates = [];if ($daysNeededToCompleteLastWeek > 0) {for ($day = 1; $day <= $daysNeededToCompleteLastWeek; $day++) {$nextMonth = date('m', strtotime('+1 month', strtotime($firstDayOfMonth)));$nextYear = date('Y', strtotime('+1 month', strtotime($firstDayOfMonth)));$nextMonthDates[] = ['day' => $day,'date' => sprintf("%04d-%02d-%02d", $nextYear, $nextMonth, $day),'is_current_month' => false,'is_prev_month' => false,'is_next_month' => true];}}// 合并所有日期$allDates = array_merge($prevMonthDates, $currentMonthDates, $nextMonthDates);// 按周分组(确保每周7天)$calendar = array_chunk($allDates, 7);return $calendar;
}

http://www.xdnf.cn/news/1060363.html

相关文章:

  • JavaEE->多线程2
  • 介绍一款免费MES、开源MES系统、MES源码
  • uni.getStorage 与 uni.getStorageSync 的区别解析
  • 矩阵变换终极笔记
  • react forwardRef和readux的connect冲突,导致ref.current获取不到值
  • infinisynapse 使用清华源有问题的暂时解决方法:换回阿里云源并安装配置PPA
  • 【MySQL基础】MySQL内置函数全面解析:提升你的数据库操作效率
  • AWK在网络安全中的高效应用:从日志分析到威胁狩猎
  • 苍穹外卖-2025 完成基础配置环节(详细图解)
  • 【嵌入式硬件实例】-555定时器控制舵机/伺服电机
  • 力扣网C语言编程题:接雨水(动态规划实现)
  • SCRM软件数据分析功能使用指南:从数据挖掘到商业决策
  • 什么是Nacos
  • TDengine 集群超能力:超越 InfluxDB 的水平扩展与开源优势
  • jquery 赋值时不触发change事件解决——仙盟创梦IDE
  • repo 工具
  • 动态规划笔记
  • FastMCP框架进行MCP开发:(一)基础环境搭建及测试
  • 云XR(AR/VR)算力底座关键特征与技术路径
  • 颈部不自主偏移现象解析
  • systemverilog中关于多线程的若干思考
  • SAP LPD(launchpad)配置使用手册
  • C#学习13——正则表达式
  • 计算机网络学习笔记:TCP可靠传输实现、超时重传时间选择
  • leetcode 2294. 划分数组使最大差为 K 中等
  • Kernel K-means:让K-means在非线性空间“大显身手”
  • 机器学习×第十二卷:回归树与剪枝策略——她剪去多余的分支,只保留想靠近你的那一层
  • Arduino Nano 33 BLE Sense Rev 2开发板使用指南之【环境搭建 / 点灯】
  • 基于微信小程序和深度学习的宠物照片拍摄指导平台的设计与实现
  • 【AI编程】第3期,针对AI生成的改枪码列表创建对应的数据库表