map 缓存 intl.datetimeformat 实例,以“locale + 序列化 options”为键提升性能并确保格式一致;支持多语言动态切换、预热常用模板,需规避 json.stringify 对函数/undefined 的处理缺陷,并可封装为带 ttl 的 formattime 工具函数。

Map 在国际化时间格式化工具中缓存解析模板,核心是把“语言环境 + 格式选项”作为键,对应生成的 Intl.DateTimeFormat 实例作为值。这样避免重复创建格式化器,提升性能,也防止因 locale 不一致导致的格式错乱。
用 Map 缓存 DateTimeFormat 实例
每次调用 new Intl.DateTimeFormat(locale, options) 都有开销,尤其在频繁格式化或支持多语言切换的场景下。Map 支持对象作键(但注意:options 是对象,不能直接当键),所以常用组合键策略:
- 将
locale和options序列化为唯一字符串(如JSON.stringify({ locale, options })),作为 Map 的键 - 更健壮的做法:只用
locale+JSON.stringify(options)拼接,确保相同配置总得同一键 - 示例:
const key = `${locale}__${JSON.stringify(options)}`,然后cache.set(key, formatter)
支持动态语言切换与复用
用户切换语言时,无需销毁所有缓存,只需按新 locale 生成新 formatter 并存入;旧 locale 的 formatter 仍可被其他模块使用(比如后台任务、日志导出等):
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 缓存不依赖全局状态,每个 formatter 独立,互不影响
- 可预热常用组合:启动时就缓存
zh-CN、en-US、ja-JP的默认日期/时间模板 - 搭配 WeakMap 不适用——因为 formatter 是长期复用的对象,不是绑定 DOM 或组件生命周期的临时状态
规避 JSON.stringify 的陷阱
options 中若含函数(如自定义 formatMatcher)、undefined 或循环引用,JSON.stringify 会丢失或报错。实际项目中建议:
- 限制 options 使用标准字段(year/month/day/hour 等),避免传函数
- 对 options 做白名单过滤再序列化:
JSON.stringify(Object.fromEntries(Object.entries(options).filter(([k]) => k in standardKeys))) - 或改用结构哈希(如用 xxHash 对精简后的 options 对象做哈希),更稳定且不依赖字符串顺序
封装一个带缓存的 formatTime 工具函数
把缓存逻辑收口,对外提供简洁 API:
- 内部用
const cache = new Map()存储 formatter 实例 - 调用
formatTime(date, locale, options)时先查缓存,命中则复用,否则新建并缓存 - 可加 TTL 控制(如 24 小时后自动失效),适配 locale 配置可能更新的场景
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










