uni-app过滤器无全局默认格式配置,所谓“默认”仅是函数参数的js默认值;统一格式应自定义过滤器并硬编码输出逻辑,如返回'yyyy-mm-dd'格式字符串。

直接在过滤器函数里写死格式,别依赖全局默认值。uni-app 的 filters 没有“默认格式”配置项,所谓“默认”只是你调用时省略第二个参数而已,本质还是靠函数内部逻辑决定。
为什么不能设全局默认格式
Vue 2(uni-app 底层)的过滤器是纯函数,接收输入、返回输出,不维护状态也不读取配置。像 date 这类过滤器(无论是 uView 注册的还是你自己写的),它的“默认行为”只体现在函数签名里——比如 date(timestamp, format = 'yyyy-mm-dd') 中的 'yyyy-mm-dd' 是 JS 默认参数,不是可配置项。
这意味着:
- 你改不了 uView 内部
timeFormat的默认值,它写死在源码里 - 你自己写的过滤器,
format参数的默认值只能在函数定义时写死,不能运行时动态切换 - 模板中写
{{ time | date }}和{{ time | date('yyyy-MM-dd') }}效果一样,但前者容易让人误以为有“配置开关”
怎么让所有 date 过滤器统一走 YYYY-MM-DD
最稳妥的做法:自己写一个封装过滤器,不调用 uView 的 timeFormat,而是用确定性更强的逻辑处理。
例如在 main.js 或 filters/index.js 中注册:
Vue.filter('date', function(value) {
if (!value) return ''
const d = new Date(value)
const year = d.getFullYear()
const month = String(d.getMonth() + 1).padStart(2, '0')
const day = String(d.getDate()).padStart(2, '0')
return `${year}-${month}-${day}`
})
这样无论传入 '2026-09-05T04:00:00'、1757044800000 还是 'Tue Sep 05 2026 04:00:00 GMT+0800',输出都是 '2026-09-05'。
注意点:
- 不要用
d.getDay()(那是星期几),要用d.getDate()(才是日期数字) - H5 端若需兼容 IE,
padStart要 polyfill 或手动补零 - 避免在过滤器里调用
uni.getSystemInfoSync()等异步/平台判断逻辑,过滤器必须同步返回
uView 的 date 过滤器能直接用吗
可以,但得清楚它的限制:
- 它默认格式确实是
'yyyy-mm-dd',但大小写敏感:'YYYY-MM-DD'不生效,必须小写yyyy - 它内部会尝试解析各种时间输入,但对非法字符串(如空、
null、'invalid')可能抛错或返回'Invalid Date' - H5 端如果传入毫秒时间戳字符串(如
'1757044800000'),它能识别;但某些旧版 uView 对秒级时间戳(1757044800)支持不稳定 - 如果你项目里已大量用了
{{ time | date }},又想统一成大写YYYY格式,只能改过滤器实现,不能只改调用写法
真正要“设默认格式”,唯一可控的方式就是自己写过滤器并确保所有调用都走它——别指望框架替你记住偏好。格式字符串写在哪一行,它就永远从那一行读。











