date-fns配置locale不生效 无法切换本地化日历日期格式
问题描述
根据date-fns官方文档中format方法的说明,尝试以本地化格式展示日期,实现代码如下:
import { format } from 'date-fns' import { faIR } from 'date-fns/locale' import { arSA } from 'date-fns/locale' // rest of the code <div> { format(new Date(), 'yyyy/MM/dd', { locale: faIR }) } <br /> { format(new Date(), 'yyyy/MM/dd', { locale: arSA }) } <br /> { format(new Date(), 'yyyy/MM/dd', { locale: ru }) } <br /> { format(new Date(), 'yyyy/MM/dd') } </div>
预期不同locale配置下会输出差异化的日期结果,但实际运行后所有配置输出完全一致:
2022/06/22 2022/06/22 2022/06/22 2022/06/22
传入的locale参数仅能实现文本内容的语言翻译,无法切换对应地区使用的日历体系,例如阿拉伯地区应使用伊斯兰阴历(回历),但实际并未切换,咨询正确的配置方式。
问题原因
date-fns v2的locale配置项仅覆盖两类本地化能力:
- 月份、星期、相对时间等文本内容的语言翻译
- 周起始日、周数计算规则这类地区通用时间习惯配置
它默认不内置多日历体系转换能力。代码中使用的yyyy/MM/dd格式符是固定按照公历(格里高利历)规则计算年月日数值的,因此无论传入什么locale,输出的公历日期结果都不会变化,只有使用MMMM(月份全称)、EEEE(星期全称)这类输出文本的格式符时,才会看到翻译效果,不会自动切换为波斯历、伊斯兰回历等其他地区常用日历。
另外原代码中使用的ru locale未做导入,运行时会抛出引用错误,使用前需要手动引入。
解决方案
date-fns将不同日历体系的能力拆分到了独立的适配包中,需要根据目标地区使用的日历引入对应包,替换主包导出的format方法即可:
- 波斯历(伊朗faIR地区):安装并引入
date-fns-jalali包,使用该包导出的format、faIR locale - 伊斯兰回历(阿拉伯arSA地区):安装并引入
date-fns-hijri包,使用该包导出的format、arSA locale - 公历地区:继续使用date-fns主包导出的format和对应locale即可
修正后的代码示例:
// 不同日历的方法从对应适配包引入,不要混用主包方法 import { format as formatGregorian } from 'date-fns' import { ru } from 'date-fns/locale' import { format as formatJalali } from 'date-fns-jalali' import { faIR } from 'date-fns-jalali/locale' import { format as formatHijri } from 'date-fns-hijri' import { arSA } from 'date-fns-hijri/locale' // rest of the code <div> {/* 波斯历日期 */} {formatJalali(new Date(), 'yyyy/MM/dd', { locale: faIR })} <br /> {/* 伊斯兰回历日期 */} {formatHijri(new Date(), 'yyyy/MM/dd', { locale: arSA })} <br /> {/* 俄语区公历日期 */} {formatGregorian(new Date(), 'yyyy/MM/dd', { locale: ru })} <br /> {/* 默认公历日期 */} {formatGregorian(new Date(), 'yyyy/MM/dd')} </div>
注意:不要跨包混用方法和locale配置,比如将主包的faIR传给date-fns-jalali的format方法,会导致格式显示异常。
如果业务中需要支持多地区动态切换,可以封装一层通用的日期格式化方法,内部根据当前选中的地区编码自动选择对应的format方法和locale配置,减少业务侧重复判断。
内容的提问来源于stack exchange,提问作者Hossein Fallah
相关产品推荐
相关产品推荐

