更新记录
1.0.0(2026-11-03) 下载此版本
新增
- 基于
picker-view的日期时间选择器组件v-datetime-picker - 多列联动:默认 5 级(年 / 月 / 日 / 时 / 分),
format含秒时扩展为 6 级 - 格式设置:
format决定显示列与顺序(可为仅年月、仅时分等任意组合),value-format决定输出类型(Date/ 时间戳 / 自定义格式字符串) - 联动逻辑:日列随「年 + 月」联动(闰年 2 月自动 29 天);各列按
start/end边界逐级收缩可选区间 - 双模式:弹层模式(底部抽屉 + 遮罩)与
inline内嵌模式 - 自带触发区:弹层模式默认渲染显示框,点击打开弹层、确认后选中值按
format显示在触发区;支持placeholder占位、默认插槽自定义外观、show-trigger关闭后改由外部visible控制,新增open事件 - Vue2 / Vue3 双兼容:
v-model(value+input/modelValue+update:modelValue/v-model:value)与v-model:visible(Vue2 用:visible.sync) - 支持
labels自定义单位文字、item-height/visible-item-count调整外观、z-index调整层级 - 兼容微信 / 支付宝 / 抖音 / 百度 / 快手 / QQ / 京东 / 飞书 / 小红书小程序,以及 H5、App(vue)
修复
- 修复 1月31日切到 2 月时日期进位跳月的问题(如 2024-01-31 切 2 月会跳成 3 月 2 日),现正确收敛为 2 月最后一天
- 修复 挂载时
visible即为true弹层不出现的问题
优化
- 5/6 级联动时年列适度加宽(
flex: 1.25),缓解 4 位年份 + 单位在均分列宽下的拥挤感;H5 与 App(vue)生效,小程序端picker-view列宽由基础库均分、该样式被忽略(无害回退为等宽) - 模板去重:内嵌 / 弹层两种模式共用同一份头部与选择器结构
- 脚本去重:format 符号表统一为单一数据源(token 解析、显示格式化、字符串输出共用);删除死代码(
maskStyle空实现、parseDigits未使用的fillEnd分支等) - 样式改为原生 CSS(去除
lang="scss",组件不再依赖项目安装 sass);删除空规则与冗余占位符样式 - 组件源码由 687 行精简至 583 行(约 -15%)
说明
- 选项单位文字(年 / 月 / 日 / 时 / 分 / 秒)与数字同行显示,与数字基线对齐
- nvue、uni-app-x、鸿蒙、快应用暂不支持(受
picker-view支持范围限制)
平台兼容性
uni-app(3.8.10)
| Vue2 | Vue3 | Chrome | Safari | app-vue | app-nvue | Android | iOS | 鸿蒙 |
|---|---|---|---|---|---|---|---|---|
| √ | √ | √ | √ | √ | - | √ | √ | - |
| 微信小程序 | 支付宝小程序 | 抖音小程序 | 百度小程序 | 快手小程序 | 京东小程序 | 鸿蒙元服务 | QQ小程序 | 飞书小程序 | 小红书小程序 | 快应用-华为 | 快应用-联盟 |
|---|---|---|---|---|---|---|---|---|---|---|---|
| √ | √ | √ | √ | √ | √ | - | √ | √ | √ | - | - |
uni-app x(3.8.10)
| Chrome | Safari | Android | iOS | 鸿蒙 | 微信小程序 |
|---|---|---|---|---|---|
| - | - | - | - | - | - |
时间选择器 v-datetime-picker
基于 picker-view 的多列联动日期时间选择器。默认 5 级联动(年 / 月 / 日 / 时 / 分),format 含秒时自动扩展为 6 级;也可通过 format 只保留其中几列(如仅年月、仅时分)。
特性
- 列由
format决定:显示哪些列、列的顺序全部由format推导,最多 6 级。 - 格式双向可控:
format控制显示与选择粒度,value-format控制v-model输出(Date/ 时间戳 / 自定义字符串)。 - 智能联动:日列随「年 + 月」联动(闰年 2 月自动 29 天);每列按
start/end边界逐级收缩可选区间。 - 双模式:弹层模式(底部抽屉 + 遮罩)与
inline内嵌模式。 - 自带触发区:默认渲染一个显示框,点击弹出选择器,确认后选中值直接显示在框内;也可用插槽自定义或关闭触发区改由外部控制。
- Vue2 / Vue3 双兼容:
v-model同时支持 Vue2(value+input)与 Vue3(modelValue+update:modelValue/v-model:value)。 - 多端一致:微信 / 支付宝 / 抖音 / 百度 / 快手 / QQ / 京东 / 飞书 / 小红书小程序,以及 H5、App(vue)。
安装
本组件为 uni_modules 规范组件,无需 npm 安装:
- 将
uni_modules/v-datetime-picker目录放入项目uni_modules下; - 直接使用
<v-datetime-picker>标签,easycom 会自动注册,无需import与components声明。
快速开始
最简用法——组件自带触发区,无需自己写按钮和 visible 状态:
<template>
<view>
<v-datetime-picker v-model="time" format="YYYY-MM-DD HH:mm" placeholder="请选择时间" />
</view>
</template>
<script>
export default {
data() {
return {
time: null // 未选择时触发区显示 placeholder;确认后自动显示选中值
}
}
}
</script>
需要外部控制弹层(如自定义按钮样式)时,关闭内置触发区并用 visible 控制:
<template>
<view>
<button @click="show = true">选择时间</button>
<text>当前:{{ text }}</text>
<v-datetime-picker
v-model="time"
:visible.sync="show"
:show-trigger="false"
format="YYYY-MM-DD HH:mm"
@confirm="onConfirm"
/>
</view>
</template>
<script>
export default {
data() {
return {
show: false,
time: new Date(), // 也支持时间戳(Number) 或字符串
text: ''
}
},
methods: {
onConfirm({ formatted }) {
this.text = formatted
}
}
}
</script>
Vue3 中把
:visible.sync="show"换成v-model:visible="show"即可,v-model用法不变。
常用示例
仅选择日期 / 年月 / 时分
<!-- 仅日期:3 列 -->
<v-datetime-picker v-model="d1" :visible.sync="s1" format="YYYY-MM-DD" />
<!-- 仅年月:2 列 -->
<v-datetime-picker v-model="d2" :visible.sync="s2" format="YYYY-MM" />
<!-- 仅时分:2 列 -->
<v-datetime-picker v-model="d3" :visible.sync="s3" format="HH:mm" />
精确到秒(6 级)
<v-datetime-picker v-model="d" :visible.sync="s" format="YYYY-MM-DD HH:mm:ss" />
输出时间戳
<v-datetime-picker
v-model="ts"
:visible.sync="s"
format="YYYY-MM-DD HH:mm"
value-format="timestamp"
/>
<!-- 确认后 ts 为毫秒时间戳(Number) -->
限制可选范围
<v-datetime-picker
v-model="d"
:visible.sync="s"
format="YYYY-MM-DD HH:mm"
start="2026-01-01 00:00"
end="2026-12-31 23:59"
/>
内嵌到页面
<v-datetime-picker inline v-model="d" format="YYYY-MM-DD HH:mm" @confirm="onConfirm" />
触发区
弹层模式下组件默认渲染一个触发区(显示框):
- 点击触发区打开弹层,确定/取消/点遮罩关闭;
- 触发区文字按
format显示当前v-model值,无值时显示placeholder; - 默认外观可通过默认插槽整体替换(替换后点击打开行为保留):
<v-datetime-picker v-model="d" format="YYYY-MM-DD HH:mm">
<view class="my-trigger">到期时间:{{ myText }}</view>
</v-datetime-picker>
- 不需要触发区时传
:show-trigger="false",由外部元素通过visible控制开关(见快速开始第二种用法)。 inline内嵌模式始终不渲染触发区。
格式设置
format:决定列
format 中的符号按顺序决定显示哪几列,重复的单位只保留一列;不在符号表内的字符(如 -、:、空格)仅用于生成 formatted 字符串,不参与列。
| 符号 | 含义 | 示例(2026-11-03 08:05:09) |
|---|---|---|
| YYYY / YY | 年(4 位 / 2 位) | 2026 / 26 |
| MM / M | 月(补零 / 原值) | 11 / 11 |
| DD / D | 日 | 03 / 3 |
| HH / H | 时(24 小时制) | 08 / 8 |
| mm / m | 分 | 05 / 5 |
| ss / s | 秒 | 09 / 9 |
hh/h同样映射到 24 小时制,本组件不提供 12 小时制(AM/PM)。
value-format:决定输出
| 取值 | 输出类型 | 说明 |
|---|---|---|
date |
Date |
默认值 |
timestamp |
Number |
毫秒时间戳 |
| 其它字符串 | String |
按该格式字符串输出,如 YYYY/MM/DD |
API
Props
| 属性 | 说明 | 类型 | 默认值 |
|---|---|---|---|
| value / v-model | 当前选中值,支持 Date / 时间戳(Number) / 字符串 |
Date / Number / String | null |
| visible | 是否显示弹层(配合 v-model:visible / :visible.sync);inline 模式下忽略 |
Boolean | false |
| format | 显示列与列顺序格式,如 YYYY-MM-DD HH:mm(5 级)、YYYY-MM-DD HH:mm:ss(6 级) |
String | YYYY-MM-DD HH:mm |
| value-format | 输出类型:date / timestamp / 自定义格式字符串 |
String | date |
| start | 可选最小值,支持 Date / 时间戳 / 字符串;为空时默认当前年 -10 |
Date / Number / String | null |
| end | 可选最大值;为空时默认当前年 +10 | Date / Number / String | null |
| title | 弹层标题 | String | 请选择时间 |
| placeholder | 触发区无选中值时显示的占位文字 | String | 请选择时间 |
| show-trigger | 是否渲染内置触发区;false 时由外部通过 visible 控制 |
Boolean | true |
| confirm-text | 确定按钮文字 | String | 确定 |
| cancel-text | 取消按钮文字 | String | 取消 |
| show-confirm | 是否显示确定按钮 | Boolean | true |
| show-cancel | 是否显示取消按钮 | Boolean | true |
| mask-closable | 点击遮罩是否关闭 | Boolean | true |
| inline | 内嵌模式:不弹层,直接渲染选择器 | Boolean | false |
| item-height | 每项高度(px) | Number | 44 |
| visible-item-count | 可见行数 | Number | 5 |
| labels | 单位文字标签,可部分覆盖 { year: '年', month: '月', ... } |
Object | 见下方默认值 |
| z-index | 弹层层级(遮罩为 z-index,面板为 z-index + 1) |
Number | 998 |
labels 默认值:{ year: '年', month: '月', day: '日', hour: '时', minute: '分', second: '秒' }
Events
| 事件名 | 说明 | 回调参数 |
|---|---|---|
| confirm | 点击确定 | { value, date, formatted } |
| cancel | 点击取消 | - |
| change | 列滚动时实时触发 | { value, date, formatted } |
| close | 弹层关闭(确定/取消/遮罩) | - |
| open | 弹层打开(点击内置触发区) | - |
回调载荷说明:
value:按value-format转换后的值,即写回v-model的值;date:原生Date对象;formatted:始终按format生成的显示字符串,与value-format无关。
change仅用于实时预览,不会写回v-model;只有confirm(或用户确认动作)才会更新绑定值。input/update:modelValue/update:value/update:visible为 v-model 通道事件,正常使用无需手动监听。
Methods
| 方法名 | 说明 |
|---|---|
| close() | 关闭弹层(通过 ref 调用),触发 close 事件 |
打开弹层请将
visible置为true(或使用ref.close()配合外部状态)。
联动与边界规则
- 日列随年月联动:2024 年(闰年)2 月显示 29 天,2023 年(平年)2 月显示 28 天。
- 边界逐级收缩:由
start/end决定。例如start为 2026-01-01 时,年份列从 2026 起、1 月之前的月份不可选;选中边界日后,时/分列也会相应收缩。 - 默认范围:未设置
start/end时,年份范围为「当前年 -10」至「当前年 +10」。 - 非法值兜底:传入值超出范围会被自动 clamp 到最近合法值;区间配置若出现
lo > hi(如自定义labels或极端start/end)会自动交换,避免空列。
常见问题
Q:Vue2 下弹层打不开?
需用 :visible.sync="show"(Vue2 语法);v-model:visible 仅 Vue3 可用。
Q:inline 模式下点击确定会关闭吗?
不会。内嵌模式不弹层,confirm 只触发事件、不回写 visible。
Q:弹层被自定义弹窗盖住?
调大 z-index 即可,遮罩取该值、面板取其 +1。
Q:为什么 formatted 和 value 不一致?
两者用途不同:formatted 恒按 format 输出(用于展示),value 按 value-format 输出(用于存储)。
兼容性
- 框架:Vue2、Vue3。
- 小程序:微信 / 支付宝 / 抖音(头条)/ 百度 / 快手 / QQ / 京东 / 飞书 / 小红书。
- Web:H5(Chrome / Safari)。
- App:App(vue)。
- 不支持:nvue、uni-app-x、鸿蒙、快应用(受
picker-view支持范围限制)。
更新日志
见 changelog.md。

收藏人数:
下载插件并导入HBuilderX
赞赏(0)
下载 2209
赞赏 11
下载 12742625
赞赏 1959
赞赏
京公网安备:11010802035340号