bricks/docs/cn.old/period.md
2025-11-19 12:30:39 +08:00

322 lines
7.5 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# `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日