layui框架实战案例(25):laydate中mark的数据后端生成

mark,自定义日期标记。该属性是对 calendar 属性的进一步延伸,灵活度更高。属性可批量设置多个日期标记,如:

javascript 复制代码
mark: {
  '0-10-14': '生日', //每年每月的某一天
  '0-0-10': '工资', // 每月 10 号
  '2008-8-8': '开幕', // 指定的日期
}

其中日期的格式必须是2008-8-8,而不能是2024-03-07,即当月份和天数是个位数时,不能用0补足。

场景描述

如在mysql数据库中遍历循环出对应的时间阶段,格式如何:

php 复制代码
// 定义多组起始和结束日期
$datePairs = [
    ['start' => '2023-03-12 08:00', 'end' => '2023-03-13 12:00'],
    ['start' => '2023-03-16 08:00', 'end' => '2023-03-17 12:00'],
    ['start' => '2023-03-19 08:00', 'end' => '2023-03-20 12:00'],
    ['start' => '2023-04-01 09:00', 'end' => '2023-04-03 15:00'],
];

封装函数

php 复制代码
function generateDateRanges($datePairs)
{
    //初始化最终合并的日期数组
    $mergedDateArray = [];

    //遍历每一组起始和结束日期
    foreach ($datePairs as $pair) {
        $startDateStr = $pair['start'];
        $endDateStr = $pair['end'];

        //创建DateTime对象
        $startDate = new DateTime($startDateStr);
        $endDate = new DateTime($endDateStr);

        //将起始日期的时间设置为午夜开始
        $startDate->setTime(0, 0, 0);

        //临时数组,用于存储当前日期对的日期范围
        $tempDateArray = [];

        //循环遍历当前日期对的日期范围
        $currentDate = clone $startDate; //克隆起始日期,以避免修改原始对象
        while ($currentDate <= $endDate) {
            //只添加日期部分(不包括时间)到临时数组中
            $tempDateArray[] = $currentDate->format('Y-n-j');
            //将当前日期增加一天
            $currentDate->modify('+1 day');
        }

        //将当前日期对的日期范围合并到最终数组中
        $mergedDateArray = array_merge($mergedDateArray, $tempDateArray);
    }

    //去除重复日期(如果需要)
    $mergedDateArray = array_unique($mergedDateArray);

    //按日期顺序排序(如果需要)
    sort($mergedDateArray);

    //转换日期格式,并生成你想要的输出格式
    $output = [];
    foreach ($mergedDateArray as $date) {
        $output[$date] = '';
    }

    //排序输出数组(如果需要)
    ksort($output);
    return $output;
}
  • 使用$currentDate->format('Y-n-j')来格式化日期,其中Y代表四位数的年份,n代表不带前导零的月份,j代表不带前导零的天数。这样,输出的日期将不会包含任何前导零;

  • 运行上述代码将得到一个日期数组,其中的键是格式化为Y-n-j的日期字符串,值则是空字符串。如果想要包含其他的值,修改 r e s u l t [ result[ result[formattedDate] = '';

  • 在遍历每个日期范围时,对$endDate使用了modify('+1 day'),这是因为DateTime对象在比较时是不包含结束日期那一天的。所以,人为地增加一天,以确保包含结束日期那天的数据。

  • 使用array_unique函数来去除数组中的重复日期(尽管在这个特定例子中由于我们按日期顺序添加,所以实际上不会有重复,但保留这一步可以作为一般性处理)。然后,使用sort函数对日期数组进行排序,确保输出结果是按日期顺序排列的。


@漏刻有时

相关推荐
用户479492835691520 小时前
Safari 中文输入法的诡异 Bug:为什么输入 @ 会变成 @@? ## 开头 做 @ 提及功能的时候,测试同学用 Safari 测出了个奇怪的问题
前端·javascript·浏览器
没有故事、有酒20 小时前
Ajax介绍
前端·ajax·okhttp
朝新_20 小时前
【SpringMVC】详解用户登录前后端交互流程:AJAX 异步通信与 Session 机制实战
前端·笔记·spring·ajax·交互·javaee
裴嘉靖20 小时前
Vue 生成 PDF 完整教程
前端·vue.js·pdf
毕设小屋vx ylw28242620 小时前
Java开发、Java Web应用、前端技术及Vue项目
java·前端·vue.js
冴羽21 小时前
今日苹果 App Store 前端源码泄露,赶紧 fork 一份看看
前端·javascript·typescript
蒜香拿铁21 小时前
Angular【router路由】
前端·javascript·angular.js
brzhang1 天前
读懂 MiniMax Agent 的设计逻辑,然后我复刻了一个MiniMax Agent
前端·后端·架构
西洼工作室1 天前
高效管理搜索历史:Vue持久化实践
前端·javascript·vue.js
广州华水科技1 天前
北斗形变监测传感器在水库安全中的应用及技术优势分析
前端