当前位置: 首页 > 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;
}

相关文章:

  • 软件项目管理(第4版)部分课后题答案
  • JS红宝书笔记 - 8.1 理解对象
  • ARINC653分区调度算法的研究与改进
  • 若依配置knife4j
  • vue 实现dot-dropdown
  • django调用 paramiko powershell 获取cpu 个数
  • io.net 携手 Walrus,为 AI 和机器学习应用提供去中心化存储与计算能力
  • 网工_STP生成树协议
  • 基于React+Express的个人账单管理系统
  • 在 linux 中实现开机自动启动 Docker 并自动运行特定镜像的容器
  • Netty实战:从核心组件到多协议实现(超详细注释,udp,tcp,websocket,http完整demo)
  • 开源大型语言模型的文本记忆新突破!
  • 腾讯云轻量级服务器Ubuntu系统与可视化界面
  • 人机融合智能 | 人智交互语境下的设计新模态
  • 【C++详解】STL-vector使用底层剖析和实现
  • 解锁身心密码:从“心”拥抱健康生活
  • MOS管和比较器
  • M1芯片macOS安装Xinference部署大模型
  • Android | 签名安全
  • camel-ai Agent模块- CriticAgent
  • joomla wordpress drupal/惠州抖音seo
  • 百度免费网站空间/福建seo推广方案
  • 医药网站建设/网站优化公司排名
  • 湛江网站建设公司/如何做推广推广技巧
  • 品牌工厂网站建设/网站宣传的方法有哪些
  • 博物馆文化网站建设/本周的新闻大事10条