HarmonyOS ArkUI DatePicker / TimePicker 日期时间选择器完全指南
系列鸿蒙 HarmonyOS 6.1 新特性实战 · 第 37 篇日期时间选择是几乎所有 App 都需要的功能。ArkUI 提供了内联式嵌入页面和弹窗式两种形态分别对应 DatePicker/TimePicker 组件和 DatePickerDialog/TimePickerDialog API。本篇全面覆盖这两种形态含农历切换和 24 小时制切换。运行效果初始状态DatePicker 和 TimePicker 内联展示滑动后选择不同日期和时间一、DatePicker 内联日期选择State selectedDate: Date new Date() State lunar: boolean false State dateStr: string DatePicker({ start: new Date(2020-01-01), end: new Date(2030-12-31), selected: this.selectedDate }) .lunar(this.lunar) // 切换农历/公历 .onDateChange((val: Date) { this.selectedDate val this.updateDateStr() // 更新显示字符串 })格式化显示日期ArkTS 不能直接用模板字符串链式调用需要辅助方法updateDateStr(): void { const y this.selectedDate.getFullYear() const m this.selectedDate.getMonth() 1 // 注意getMonth() 从 0 开始 const d this.selectedDate.getDate() this.dateStr ${y} 年 ${m} 月 ${d} 日 }农历切换Toggle({ type: ToggleType.Switch, isOn: this.lunar }) .selectedColor(#0066ff) .onChange((val: boolean) { this.lunar val })lunar属性为true时DatePicker 切换为农历显示。二、TimePicker 内联时间选择State selectedHour: number 14 State selectedMinute: number 30 State useTwentyFour: boolean true TimePicker({ selected: new Date(2000, 0, 1, this.selectedHour, this.selectedMinute) }) .useMilitaryTime(this.useTwentyFour) // true24小时制 .onChange((val: TimePickerResult) { this.selectedHour val.hour this.selectedMinute val.minute this.updateTimeStr() })回调方法名TimePicker 使用.onChange()而非.onTimeChange()一个常见陷阱。格式化时间字符串updateTimeStr(): void { const h this.selectedHour 10 ? 0 this.selectedHour : this.selectedHour.toString() const min this.selectedMinute 10 ? 0 this.selectedMinute : this.selectedMinute.toString() const period this.useTwentyFour ? : (this.selectedHour 12 ? 上午 : 下午 ) this.timeStr period h : min }三、弹窗式选择器实际业务首选内联选择器占空间大业务中更常用弹窗形式// 日期弹窗 Button(打开日期弹窗) .onClick(() { DatePickerDialog.show({ start: new Date(2020-01-01), end: new Date(2030-12-31), selected: this.selectedDate, lunar: this.lunar, onAccept: (val: DatePickerResult) { const y val.year ?? this.selectedDate.getFullYear() const m (val.month ?? this.selectedDate.getMonth() 1) - 1 const d val.day ?? this.selectedDate.getDate() this.selectedDate new Date(y, m, d) this.updateDateStr() } }) }) // 时间弹窗 Button(打开时间弹窗) .onClick(() { TimePickerDialog.show({ selected: new Date(2000, 0, 1, this.selectedHour, this.selectedMinute), useMilitaryTime: this.useTwentyFour, onAccept: (val: TimePickerResult) { this.selectedHour val.hour this.selectedMinute val.minute this.updateTimeStr() } }) })注意DatePickerResult.month从 1 开始DatePickerDialog的onAccept回调中val.month是 1-12与 JavaScriptgetMonth()的 0-11 不同构造new Date()时需要减 1。完整代码Entry Component struct Index { State selectedDate: Date new Date() State selectedHour: number 14 State selectedMinute: number 30 State lunar: boolean false State useTwentyFour: boolean true State dateStr: string State timeStr: string aboutToAppear(): void { this.updateDateStr() this.updateTimeStr() } updateDateStr(): void { const y this.selectedDate.getFullYear() const m this.selectedDate.getMonth() 1 const d this.selectedDate.getDate() this.dateStr ${y} 年 ${m} 月 ${d} 日 } updateTimeStr(): void { const h this.selectedHour 10 ? 0 this.selectedHour : this.selectedHour.toString() const min this.selectedMinute 10 ? 0 this.selectedMinute : this.selectedMinute.toString() const period this.useTwentyFour ? : (this.selectedHour 12 ? 上午 : 下午 ) this.timeStr period h : min } build() { Scroll() { Column({ space: 20 }) { Text(DatePicker / TimePicker 完全指南) .fontSize(21).fontWeight(FontWeight.Bold).fontColor(#1a1a1a) // DatePicker Column({ space: 10 }) { Text(一、DatePicker 日期选择器).fontSize(15).fontWeight(FontWeight.Bold).fontColor(#333) Row({ space: 12 }) { Text(农历模式).fontSize(14).fontColor(#555) Toggle({ type: ToggleType.Switch, isOn: this.lunar }).selectedColor(#0066ff) .onChange((val: boolean) { this.lunar val }) Text(this.lunar ? 开 : 关).fontSize(13).fontColor(this.lunar ? #0066ff : #aaa) } .alignItems(VerticalAlign.Center) DatePicker({ start: new Date(2020-01-01), end: new Date(2030-12-31), selected: this.selectedDate }) .lunar(this.lunar) .onDateChange((val: Date) { this.selectedDate val; this.updateDateStr() }) Text(选中日期 this.dateStr).fontSize(16).fontColor(#0066ff).fontWeight(FontWeight.Bold) } .padding(12).backgroundColor(#fff).borderRadius(8).width(100%) .border({ width: 1, color: #e0e0e0 }).alignItems(HorizontalAlign.Start) // TimePicker Column({ space: 10 }) { Text(二、TimePicker 时间选择器).fontSize(15).fontWeight(FontWeight.Bold).fontColor(#333) Row({ space: 12 }) { Text(24小时制).fontSize(14).fontColor(#555) Toggle({ type: ToggleType.Switch, isOn: this.useTwentyFour }).selectedColor(#0066ff) .onChange((val: boolean) { this.useTwentyFour val; this.updateTimeStr() }) } .alignItems(VerticalAlign.Center) TimePicker({ selected: new Date(2000, 0, 1, this.selectedHour, this.selectedMinute) }) .useMilitaryTime(this.useTwentyFour) .onChange((val: TimePickerResult) { this.selectedHour val.hour; this.selectedMinute val.minute; this.updateTimeStr() }) Text(选中时间 this.timeStr).fontSize(16).fontColor(#0066ff).fontWeight(FontWeight.Bold) } .padding(12).backgroundColor(#fff).borderRadius(8).width(100%) .border({ width: 1, color: #e0e0e0 }).alignItems(HorizontalAlign.Start) // 弹窗式 Column({ space: 10 }) { Text(三、弹窗式选择器).fontSize(15).fontWeight(FontWeight.Bold).fontColor(#333) Button(打开日期弹窗 DatePickerDialog) .width(100%).height(44).backgroundColor(#0066ff).fontColor(#fff).borderRadius(8) .onClick(() { DatePickerDialog.show({ start: new Date(2020-01-01), end: new Date(2030-12-31), selected: this.selectedDate, lunar: this.lunar, onAccept: (val: DatePickerResult) { const y val.year ?? this.selectedDate.getFullYear() const m (val.month ?? this.selectedDate.getMonth() 1) - 1 const d val.day ?? this.selectedDate.getDate() this.selectedDate new Date(y, m, d) this.updateDateStr() } }) }) Button(打开时间弹窗 TimePickerDialog) .width(100%).height(44).backgroundColor(#27ae60).fontColor(#fff).borderRadius(8) .onClick(() { TimePickerDialog.show({ selected: new Date(2000, 0, 1, this.selectedHour, this.selectedMinute), useMilitaryTime: this.useTwentyFour, onAccept: (val: TimePickerResult) { this.selectedHour val.hour; this.selectedMinute val.minute; this.updateTimeStr() } }) }) Text(选中${this.dateStr} ${this.timeStr}).fontSize(14).fontColor(#0066ff).fontWeight(FontWeight.Bold) } .padding(12).backgroundColor(#fff).borderRadius(8).width(100%) .border({ width: 1, color: #e0e0e0 }).alignItems(HorizontalAlign.Start) } .padding(20).width(100%) } .width(100%).height(100%).backgroundColor(#f5f5f5) } }API 速查组件/属性说明DatePicker({ start, end, selected })日期选择器.lunar(bool)切换农历.onDateChange((val: Date) {})日期变化回调TimePicker({ selected: new Date(...) })时间选择器.useMilitaryTime(bool)24 小时制.onChange((val: TimePickerResult) {})时间变化回调注意不是 onTimeChangeDatePickerDialog.show({ ..., onAccept })弹窗式日期选择TimePickerDialog.show({ ..., onAccept })弹窗式时间选择小结TimePicker 回调是.onChange()而非.onTimeChange()官方文档有时写错以实际 API 为准弹窗式是业务首选内联式占大量垂直空间弹窗式更紧凑DatePickerResult.month 从 1 开始与 JS Date 的getMonth()0-11 不一致转换时记得 -1aboutToAppear初始化显示字符串不然首次渲染看不到当前日期文字上一篇Progress 进度条5 种类型与动画演示 | 下一篇Select 与 TextPicker 选择器

相关新闻

FastAPI + 异步 SQLAlchemy 新手导包速查,解决导包对应混乱问题

FastAPI + 异步 SQLAlchemy 新手导包速查,解决导包对应混乱问题

摘要:本文基于 FastAPI 异步 SQLAlchemy 实战项目,系统梳理路由层、数据库配置层、ORM 模型层、crud 操作层、schemas 校验层、utils 工具层共六层的标准导入规范,逐层给出导入语句、功能作用与完整可复用代码示例,并标注 CORS 凭…

2026/7/19 2:45:27阅读更多 →
AM62L硬件防火墙配置实战:从原理到寄存器级安全策略实现

AM62L硬件防火墙配置实战:从原理到寄存器级安全策略实现

1. 硬件防火墙在AM62L SoC中的核心价值与设计哲学在嵌入式系统,尤其是像德州仪器AM62L这类面向工业与汽车应用的Sitara处理器中,硬件防火墙(Hardware Firewall)绝非一个可有可无的“附加功能”,而是系统安全架构的基石…

2026/7/19 2:45:27阅读更多 →
朴素贝叶斯原理与实战:小样本、高实时、强解释的分类利器

朴素贝叶斯原理与实战:小样本、高实时、强解释的分类利器

1. 项目概述:朴素贝叶斯不是“朴素”的凑合,而是有底气的极简主义你有没有遇到过这样的场景:手头只有几百条带标签的客户投诉文本,要快速搭建一个能自动分类“物流问题”“产品质量”“售后服务”的模型;或者在嵌入式设…

2026/7/19 2:45:27阅读更多 →
10W-5.8G无人机图传模块|维安康

10W-5.8G无人机图传模块|维安康

一、产品参数二、产品特点三、接口功能定义及操作说明四、频率表1 ,功率及指示灯状态(PWR LED 闪烁次数)2 ,频组,频道及指示灯状态(LED 闪烁次数)3 ,安装尺寸图五、备注&#xff1a…

2026/7/19 5:45:43阅读更多 →
图数据库实战入门:关系建模与实时遍历技术解析

图数据库实战入门:关系建模与实时遍历技术解析

1. 这不是又一本讲“图”的数学书——它解决的是你每天都在撞墙的真实数据困境“图数据库”这个词,第一次听时我正被一个客户的需求逼到墙角:他们要做一个实时推荐系统,用户行为、商品属性、店铺关系、地域偏好、社交关注链……十几个维度的数…

2026/7/19 5:45:43阅读更多 →
Mac Mouse Fix终极指南:如何用开源工具彻底解决macOS鼠标体验的5大痛点

Mac Mouse Fix终极指南:如何用开源工具彻底解决macOS鼠标体验的5大痛点

Mac Mouse Fix终极指南:如何用开源工具彻底解决macOS鼠标体验的5大痛点 【免费下载链接】mac-mouse-fix Mac Mouse Fix - Make Your $10 Mouse Better Than an Apple Trackpad! 项目地址: https://gitcode.com/GitHub_Trending/ma/mac-mouse-fix 你是否曾在m…

2026/7/19 5:45:43阅读更多 →
老旧电脑改造Linux家庭服务器全攻略

老旧电脑改造Linux家庭服务器全攻略

1. 项目概述:低配电脑变身高效Linux家庭服务器十年前的老旧笔记本在抽屉里吃灰?别急着扔,给它装上最新版Ubuntu 24.04 LTS,立马变身7x24小时稳定运行的家庭服务器。我最近就用一台2014年的联想ThinkPad X240(i5-4300U/…

2026/7/19 5:45:43阅读更多 →
Python 字符串操作完全指南:从定义到常用方法

Python 字符串操作完全指南:从定义到常用方法

在 Python 中,字符串(String)是由零个或多个字符组成的不可变序列,用于表示文本数据。字符串可以使用单引号(" ")、双引号(" ")或三引号("&quo…

2026/7/19 5:45:43阅读更多 →
Android开源库发布JCenter全流程指南

Android开源库发布JCenter全流程指南

1. 开源库发布到JCenter的核心价值作为一名长期维护Android开源项目的开发者,我深刻体会到将库发布到JCenter的重要性。JCenter作为Android开发领域的默认仓库,其优势主要体现在三个方面:首先,依赖管理效率提升显著。当你的库被集…

2026/7/19 5:43:43阅读更多 →
Go语言静态资源打包方案对比与实践指南

Go语言静态资源打包方案对比与实践指南

1. 项目背景与核心需求在Go语言开发中,我们经常需要处理静态资源文件的打包问题。无论是Web应用的模板文件、前端资源,还是配置文件、证书等,都需要随程序一起分发。传统做法是将这些文件与编译后的二进制文件放在同一目录下,但这…

2026/7/19 0:01:04阅读更多 →
Go语言实现高性能LDAP认证服务的架构与实践

Go语言实现高性能LDAP认证服务的架构与实践

1. 项目背景与核心价值LDAP(轻量级目录访问协议)作为企业级身份认证的黄金标准,已经服务了超过80%的财富500强公司。我在金融科技领域实施统一认证体系时,发现传统Java方案存在启动慢、内存占用高等痛点。而Go语言凭借其协程并发模…

2026/7/19 0:01:04阅读更多 →
【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

更多请点击: https://intelliparadigm.com 第一章:AI面试官实战指南的核心价值与适用场景 AI面试官并非替代人类HR的“黑箱工具”,而是以可解释、可审计、可迭代的方式,赋能招聘全链路的关键基础设施。其核心价值在于将主观经验沉…

2026/7/19 0:01:04阅读更多 →
Go语言静态资源打包方案对比与实践指南

Go语言静态资源打包方案对比与实践指南

1. 项目背景与核心需求在Go语言开发中,我们经常需要处理静态资源文件的打包问题。无论是Web应用的模板文件、前端资源,还是配置文件、证书等,都需要随程序一起分发。传统做法是将这些文件与编译后的二进制文件放在同一目录下,但这…

2026/7/19 0:01:04阅读更多 →
Go语言实现高性能LDAP认证服务的架构与实践

Go语言实现高性能LDAP认证服务的架构与实践

1. 项目背景与核心价值LDAP(轻量级目录访问协议)作为企业级身份认证的黄金标准,已经服务了超过80%的财富500强公司。我在金融科技领域实施统一认证体系时,发现传统Java方案存在启动慢、内存占用高等痛点。而Go语言凭借其协程并发模…

2026/7/19 0:01:04阅读更多 →
【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

更多请点击: https://intelliparadigm.com 第一章:AI面试官实战指南的核心价值与适用场景 AI面试官并非替代人类HR的“黑箱工具”,而是以可解释、可审计、可迭代的方式,赋能招聘全链路的关键基础设施。其核心价值在于将主观经验沉…

2026/7/19 0:01:04阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时,发现推理速度只有可怜的 1-2 FPS,而别人的演示视频却能跑到 30 FPS 以上,那么问题很可能不在模型本身,而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后,会直接使用官方示例…

2026/7/18 22:49:46阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一:为什么你需要了解 Coze 和 Dify?如果你对 AI 应用开发感兴趣,但一看到“大模型”、“智能体”、“工作流”这些词就头疼,觉得门槛太高,那这篇文章就是为你准备的。很多开发者,包括我自己&#…

2026/7/18 14:49:24阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会:配图一直是个让人头疼的问题。2026年,AI生图工具已经非常成熟了,但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1:速度之王2026年6月11日&#xff0c…

2026/7/18 18:49:35阅读更多 →