053 DateRangePicker · 日期范围选择器
用途
在弹层中先选开始日期、再选结束日期,悬停时预览范围,确认后写入。
最小示例
var stay datetime.DateRange
view := func(c *ui.Context) {
core.Use(c, core.Settings{})
r := datetime.DateRangePicker(c, &stay, datetime.DateRangePickerOptions{Label: "Stay"})
if r.Changed() {
fmt.Println("stay", stay.Start, stay.End, stay.Days())
}
}
ui.Render(view, 400, 300, 1)参数
func DateRangePicker(c *ui.Context, value *DateRange, opts DateRangePickerOptions) DateTimeResult,返回值的 Element 字段是组件元素。
| 字段 | 类型 | 默认值 | 含义 |
|---|---|---|---|
Layout | string | 2006-01-02 | 触发器与摘要中的日期格式。 |
Min | Date | 零值 | 两端最早日期。 |
Max | Date | 零值 | 两端最晚日期。 |
DisableDate | func(Date) bool | nil | 不可选日期;范围内包含此类日期时拒绝并提示。 |
WeekStart | WeekStart | WeekStartLocale | 周起始日。 |
Today | Date | 零值(系统时钟) | 今日标记与空值时的起始月份。 |
ReadOnly | bool | false | 只读:可聚焦、可复制(Cmd/Ctrl+C),不能修改,不打开弹层。 |
Disabled | bool | false | 禁用。 |
Label | string | 内置“日期范围” | 辅助技术名称。 |
状态
触发器:默认、悬停、聚焦、禁用。弹层:起止日期酒红填充,中间日期浅色带;选择结束前随指针或焦点预览范围;错误说明;“确定”在两端选齐前禁用。
事件
Changed():点击“确定”或“清空”使值改变时为 true。Canceled():按 Escape、点击“取消”或点击弹层外关闭、草稿被丢弃时为 true。
键盘操作
- Enter/Space/↓:打开弹层。
- 日历内方向键移动,Enter 依次选择开始与结束。
- 早于开始日期的选择会重新开始范围。
- Tab 到“清空”“取消”“确定”。
- Escape:放弃草稿。
限制
- 弹层一次显示一个月;跨月范围通过翻页完成。
DateRange为闭区间,Days()计入两端。- 日期与时间值不带时区:
Date、YearMonth、TimeOfDay只保存日历字段,组件内部计算不做 UTC 转换。 Today为零值时读取c.Now()(系统本地时区);需要固定“今天”(测试、跨时区应用)时显式传入。- 无障碍:MyGo v0.2.10 没有公开设置弹出按钮展开状态(
expanded)、数值范围(hasRange/accRange)与值(accValue)的接口,这些字段只在 MyGo 内部组件中赋值(ui/element.go:286-295,例如 ui/base.go:297、ui/indicators.go:61)。因此触发器只能声明为RolePopUpButton而无法报告展开状态;时间段以Description读出当前值与范围,错误通过Error()关联。

