javascript中用柯里化实现多语言日期格式化,核心是先固定locale(如'zh-cn')返回仅接收date的函数,再调用时输出格式化字符串;基于intl.datetimeformat原生api,支持缓存优化与多级柯里化(locale→style→date),兼顾复用性、可读性与灵活性。

JavaScript 中用柯里化实现多语言日期格式化,核心是把“语言”和“日期”两个参数分步传入:先固定语言(如 zh-CN 或 en-US),返回一个只接收日期的函数,再调用时直接格式化输出。这样既复用逻辑,又提升可读性和调用便利性。
用 Intl.DateTimeFormat 搭配柯里化
Intl.DateTimeFormat 是浏览器原生支持的国际化日期格式化 API,无需第三方库。柯里化后可封装成按语言预设的格式器:
- 第一层参数是 locale(如
'zh-CN'),返回一个函数 - 第二层参数是 date(
Date实例或时间戳),执行格式化并返回字符串 - 可选传入
options(如{ year: 'numeric', month: 'short', day: 'numeric' })增强灵活性
示例代码:
const createFormatter = (locale, options = {}) => {
const formatter = new Intl.DateTimeFormat(locale, options);
return (date) => formatter.format(date);
};
// 创建中文和英文格式器
const formatDateZh = createFormatter('zh-CN', {
year: 'numeric', month: '2-digit', day: '2-digit'
});
const formatDateEn = createFormatter('en-US', {
month: 'short', day: 'numeric', year: 'numeric'
});
console.log(formatDateZh(new Date())); // "2024/07/15"
console.log(formatDateEn(new Date())); // "Jul 15, 2024"
支持动态 locale 和缓存优化
实际项目中 locale 可能运行时确定(如用户切换语言)。可在柯里化基础上加一层工厂函数,避免重复创建 Intl.DateTimeFormat 实例:
Java开发手册规约集合,基于阿里巴巴Java开发手册(嵩山版)。 涵盖7大维度:编程规约、异常日志、单元测试、安全规约、MySQL数据库、工程结构、设计规约。 当用户需要:(1) 编写或审查Java代码 (2) 检查命名/代码规范 (3) 处理异常和日志 (4) 编写单元测试 (5) 安全编码 (6) 数据库设...
- 用 Map 缓存已创建的 formatter,key 为
locale + JSON.stringify(options) - 首次调用时生成,后续直接复用,提升性能
- 仍保持柯里化调用风格:
getFormatter('ja-JP')('2024-07-15')
扩展:支持多种格式类型(短/中/长/完整)
不同场景需要不同粒度的格式(如列表用 short,详情页用 full)。可将 format 类型也纳入柯里化链:
- 第一层:locale
- 第二层:style(
'short'/'medium'/'long'/'full') - 第三层:date
例如:
const createStyledFormatter = (locale) => (style) => {
const options = {
year: 'numeric',
month: style === 'short' ? 'numeric' : 'long',
day: 'numeric',
...(style === 'full' && { weekday: 'long', hour: '2-digit', minute: '2-digit' })
};
const formatter = new Intl.DateTimeFormat(locale, options);
return (date) => formatter.format(date);
};
const zhFull = createStyledFormatter('zh-CN')('full');
console.log(zhFull(new Date())); // "2024年7月15日星期一 下午3:22"
注意事项与兼容性
使用时需注意几点:
-
Intl.DateTimeFormat在所有现代浏览器和 Node.js ≥14 中默认可用;旧环境需引入intlpolyfill - locale 字符串要合法(如
'zh-CN'、'pt-BR'),否则回退到运行时默认语言 - 柯里化本身不处理日期解析(如字符串转 Date),建议搭配
new Date(input)或Date.parse()预处理 - 若需服务端渲染(SSR),确保 Node.js 环境启用 ICU 数据(通常已内置,必要时用
--icu-data-dir指定)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










