# `bricks` 日期工具与组件库技术文档 --- ## 概述 `bricks` 是一个轻量级的 JavaScript 工具和 UI 组件库,提供常用的日期处理函数以及可交互的日期周期控件。本文档详细说明其核心功能模块: - 日期字符串与 `Date` 对象之间的转换 - 日期增减操作(天、月、年) - `PeriodDays` 可点击切换周期的 UI 控件 该库设计用于前端项目中快速构建时间范围选择器等交互式组件。 --- ## 全局命名空间 ```js var bricks = window.bricks || {}; ``` > 所有功能均挂载在全局 `bricks` 命名空间下,避免污染全局作用域。 --- ## 1. `bricks.str2date(sdate)` 将格式为 `"YYYY-MM-DD"` 的字符串转换为 `Date` 对象。 ### 参数 | 参数名 | 类型 | 描述 | |----------|--------|------------------------| | `sdate` | string | 格式为 `"YYYY-MM-DD"` 的日期字符串 | ### 返回值 - `{Date}`:对应的 `Date` 对象(注意:月份从 0 开始) ### 示例 ```js bricks.str2date("2025-04-05"); // 返回 Date 对象,表示 2025年4月5日 ``` ### 注意事项 - 输入字符串必须符合 `YYYY-MM-DD` 格式。 - `new Date(year, month - 1, day)` 中月份需减 1,因 JS 的 `Date` 对象月份从 0 起始。 --- ## 2. `bricks.date2str(date)` 将 `Date` 对象格式化为 `"YYYY-MM-DD"` 字符串。 ### 参数 | 参数名 | 类型 | 描述 | |----------|--------|--------------------| | `date` | Date | 要格式化的日期对象 | ### 返回值 - `{string}`:格式化后的 `"YYYY-MM-DD"` 字符串,不足两位自动补零。 ### 示例 ```js const d = new Date(2025, 3, 5); // 2025-04-05 bricks.date2str(d); // "2025-04-05" ``` --- ## 3. `bricks.addMonths(dateObj, months)` 在指定日期上增加若干个月。 ### 参数 | 参数名 | 类型 | 描述 | |------------|--------|--------------------------| | `dateObj` | Date | 原始日期对象 | | `months` | number | 要增加的月数(可为负) | ### 返回值 - `{Date}`:新的 `Date` 对象,原对象不被修改 ### 示例 ```js const d = new Date(2025, 0, 15); // 2025-01-15 bricks.addMonths(d, 3); // 2025-04-15 bricks.addMonths(d, -1); // 2024-12-15 ``` --- ## 4. `bricks.addYears(dateObj, years)` 在指定日期上增加若干年。 ### 参数 | 参数名 | 类型 | 描述 | |-----------|--------|--------------------------| | `dateObj` | Date | 原始日期对象 | | `years` | number | 要增加的年数(可为负) | ### 返回值 - `{Date}`:新的 `Date` 对象 ### ⚠️ 注意 使用了 `setYear()` 方法,但请注意: - `setYear()` 在现代 JS 中已被弃用,推荐使用 `setFullYear()` 替代。 - 当前实现可能存在问题:`getYear()` 返回的是相对于 1900 的偏移量,因此 `+ years` 实际上是错误逻辑! ### ✅ 修正建议 ```js bricks.addYears = function(dateObj, years){ const newDate = new Date(dateObj); newDate.setFullYear(newDate.getFullYear() + years); return newDate; } ``` > 建议尽快替换以确保跨世纪正确性(如 2099 → 2100 年等问题)。 --- ## 5. `bricks.addDays(dateObj, days)` 在指定日期上增加若干天。 ### 参数 | 参数名 | 类型 | 描述 | |----------|--------|--------------------------| | `dateObj`| Date | 原始日期对象 | | `days` | number | 要增加的天数(可为负) | ### 返回值 - `{Date}`:新的 `Date` 对象 ### 示例 ```js const d = new Date(2025, 0, 1); bricks.addDays(d, 10); // 2025-01-11 bricks.addDays(d, -1); // 2024-12-31 ``` --- ## 6. `bricks.PeriodDays` —— 周期日期选择控件 一个继承自 `bricks.HBox` 的 UI 组件,允许用户通过点击前后文本切换时间区间。 ### 继承关系 ```js class PeriodDays extends bricks.HBox ``` ### 配置选项 (`opts`) | 属性名 | 类型 | 默认值 | 描述 | |--------------|----------|-------------|------| | `start_date` | string | 必填 | 起始日期 `"YYYY-MM-DD"` | | `end_date` | string | 必填 | 结束日期 `"YYYY-MM-DD"` | | `step_type` | string | `'days'` | 步进类型:`'days'`, `'months'`, `'years'` | | `step_cnt` | number | `1` | 每次步进的数量 | | `title` | string | `undefined` | 显示标题(支持国际化) | | `splitter` | string | `' 至 '` | 分隔符文本,显示在起止日期之间 | ### 支持事件 - **`changed`**:当日期范围发生变化时触发,携带新范围数据。 #### 事件参数结构 ```json { "start_date": "YYYY-MM-DD", "end_date": "YYYY-MM-DD" } ``` ### 成员方法 #### `date_add(strdate, step_cnt, step_type)` 内部方法:对字符串日期执行加法运算并返回新字符串。 ##### 参数 | 参数名 | 类型 | 描述 | |--------------|----------|------| | `strdate` | string | 输入日期字符串 | | `step_cnt` | number | 步进步数 | | `step_type` | string | `'days'`, `'months'`, `'years'` | ##### 返回值 - `{string}`:结果日期字符串(格式 `"YYYY-MM-DD"`) ##### 示例 ```js this.date_add("2025-01-01", 1, "months"); // "2025-02-01" ``` --- #### `step_back()` 点击起始日期时触发,整体周期向前移动(减去步长)。 - 更新 `start_date` 和 `end_date` - 刷新界面显示 - 触发 `changed` 事件 --- #### `step_forward()` 点击结束日期时触发,整体周期向后移动(加上步长)。 - 同上,方向相反 --- ### 用户交互设计 | 元素 | 行为 | |----------------|------------------------------| | 起始日期文本 | 点击 → 周期整体前移 | | 结束日期文本 | 点击 → 周期整体后移 | > 文本添加了 `clickable` CSS 类,并绑定点击事件。 --- ### 使用示例 ```js const period = new bricks.PeriodDays({ start_date: "2025-01-01", end_date: "2025-01-31", step_type: "months", step_cnt: 1, title: "统计周期", splitter: " 至 " }); // 监听变化 period.bind('changed', function(e){ console.log("新周期:", e.start_date, "到", e.end_date); }); ``` 渲染效果类似: ``` 统计周期 2025-01-01 至 2025-01-31 ``` 点击 “2025-01-01” → 变为 “2024-12-01 至 2024-12-31” 点击 “2025-01-31” → 变为 “2025-02-01 至 2025-02-28” --- ## 注册组件 ```js bricks.Factory.register('PeriodDays', bricks.PeriodDays); ``` > 使得可通过工厂模式动态创建此组件。 --- ## 总结 | 功能 | 是否推荐使用 | 备注 | |----------------------|--------------|------| | `str2date` / `date2str` | ✅ 推荐 | 安全可靠 | | `addDays` / `addMonths` | ✅ 推荐 | 正确封装 | | `addYears` | ⚠️ 需修复 | 应改用 `setFullYear` | | `PeriodDays` | ✅ 推荐 | 交互清晰,适合报表周期切换 | --- ## 附录:已知问题与改进建议 1. ❗ `addYears` 使用 `getYear/setYear` 存在兼容性和逻辑错误,应改为: ```js bricks.addYears = function(dateObj, years) { const newDate = new Date(dateObj); newDate.setFullYear(newDate.getFullYear() + years); return newDate; }; ``` 2. ✅ 所有日期操作均创建副本,保护原始对象,良好实践。 3. 🔹 `PeriodDays` 未做边界校验(如非法日期),建议增加输入验证。 4. 🔹 支持更多 `step_type` 如 `'weeks'` 可扩展性更强。 --- > 文档版本:v1.0 > 最后更新:2025年4月5日