直接用 formatdate 的 e 占位符可输出“星期一”,但需工具函数支持该标识;不支持时应 fallback 为 getday() 查数组;vue 3 中过滤器已移除,须改用函数调用;注意 getday() 周日为 0,国内常需偏移处理;各端 date 解析差异可能导致无效日期。

直接用 formatDate 工具函数的 E 占位符就能输出“星期一”这类中文星期,不需要额外写 switch 或数组映射——前提是你的日期格式化工具支持该标识。
uni-app 里 format 函数必须支持 E 才能转星期几
很多项目自己封装的 formatDate(比如从知识库中看到的 utils/dateFormatter.js)明确写了支持 E:输出“星期一”“星期二”…,而 e 输出“Mon”“Tue”等英文缩写。但如果你用的是别人写的简易版、或没声明支持 E 的函数,它大概率会原样返回字母,不转换。
- 检查你项目里的
formatDate实现中是否包含类似'E+': ['星期日', '星期一', '星期二', '星期三', '星期四', '星期五', '星期六'][date.getDay()]这样的逻辑 - 若没有,别硬改原型,直接在模板里调用时传入带
E的格式串,比如formatDate(date, 'E'),看是否输出预期文字 - 不支持就 fallback:用
date.getDay()得到 0–6,再查数组['星期日', '星期一', ..., '星期六']
过滤器写法要避开 Vue 2/3 的语法断层
uni-app 同时支持 Vue 2 和 Vue 3 的编译模式,但过滤器(filters)在 Vue 3 组合式 API 中已被移除。如果你在 <script setup></script> 里写 filters: { week: ... },H5 可能报错,小程序直接不生效。
- Vue 2 选项式写法可用过滤器:
<view>{{ date | week }}</view>,配合filters: { week(d) { return formatDate(d, 'E') } } - Vue 3
setup中请改用函数调用:<view>{{ formatDate(date, 'E') }}</view>,并确保formatDate已import且可访问 - 不要在
filters里 new Date() 或做复杂计算——过滤器无响应性,date 变了它不会自动重算
getDay() 返回值是 0–6,但周几起始取决于业务规则
JavaScript 的 Date.prototype.getDay() 固定以周日为 0,周一为 1。但国内多数业务要求“周一为第一天”,比如排班、周报统计。这时候直接映射 ['周日','周一',...] 就会错位。
- 如果 UI 上要显示“周一至周日”,且数据源是后端返回的数字(如 1=周一),别依赖
getDay(),直接查表:['', '周一', '周二', '周三', '周四', '周五', '周六', '周日'][num] - 如果输入是 Date 实例,又确实要按“周一为第 1 天”来显示中文,得手动偏移:
const day = date.getDay(); const zhDay = ['星期一', '星期二', '星期三', '星期四', '星期五', '星期六', '星期日'][(day + 6) % 7] - 注意:uni-calendar 组件回调里的
week字段(如e.week === '星期三')已按中文习惯处理好,无需再转
真正容易被忽略的是:不同端对 Date 构造函数的解析差异。比如 new Date('2026-08-05') 在 H5 正常,在微信小程序可能变成 Invalid Date——务必统一用时间戳或 new Date(2026, 7, 5) 初始化,再调 formatDate。否则星期转换第一步就崩了。










