uniapp开发问题记录(2)--“YYYY-MM-DD”时间字符串格式获取

55 阅读1分钟

问题

请求接口需要“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) 最方便;
要本地日历 → 手拼最安全。