问题
请求接口需要“YYYY-MM-DD”时间字符串,使用了new Date().toLocaleDateString('en-CA')来获取结果示例(东八区 2026-01-17 08:30) "2026-01-17" ,但在线上却行不通,接口获取不到数据。
原因:
在微信小程序(尤其是安卓真机)里写:
JavaScript
复制
new Date().toLocaleDateString('en-CA')
不会保证返回 "YYYY-MM-DD" ,而是可能得到:
"2024/06/03"(安卓最常见)"2019年11月20日"(部分 iOS)"11/20/2019"(地区语言设置不同)
总之格式完全取决于系统语言和宿主环境对 Intl 的支持程度,没有任何兼容性保障。
最稳妥的写法(推荐)
直接手拼,彻底摆脱环境差异:
JavaScript
复制
const d = new Date()
const dateStr = `${d.getFullYear()}-${String(d.getMonth() + 1).padStart(2, '0')}-${String(d.getDate()).padStart(2, '0')}`
// 结果一定是 "2024-06-03"
这段代码在开发者工具、iOS、安卓、线上版本表现完全一致,也是小程序社区最常用方案。
结论:
想要稳定拿到 "YYYY-MM-DD",就别用 toLocaleDateString,手拼最保险。
还有一个:
使用new Date().toISOString().slice(0, 10)也可以获取时间字符串
但要先确认一点:它按 UTC 零时区算日期。
- 在中国(东八区)
今天 08:00 以前调用,得到的是昨天的日期;
08:00 及以后调用,得到的才是今天的日期。
如果业务允许“UTC 自然日”或者只在服务器端/云函数里用,这条语句最简洁:
new Date().toISOString().slice(0, 10) // 一定 "YYYY-MM-DD"
小程序端想拿“用户本地今天”就别用它,否则凌晨 0–8 点会出现“日期少一天”的坑;
继续用手拼:
const d = new Date()
`${d.getFullYear()}-${String(d.getMonth()+1).padStart(2,'0')}-${String(d.getDate()).padStart(2,'0')}`
一句话:
要 UTC 日期 → toISOString().slice(0,10) 最方便;
要本地日历 → 手拼最安全。