如何修复SimpleDateFormat输出阿拉伯数字日期以适配Firebase存储的问题
固定输出公历拉丁数字日期的修复方案
问题根源
现有代码将Locale.getDefault()传入格式化器,当设备处于阿拉伯语地区时,系统会自动匹配对应区域的阿拉伯-印度数字书写规则,最终输出类似٢٠٢١-٠٤-١٧的非预期格式,无法满足统一存储标准公历数字的需求。
修复逻辑
格式化时不跟随系统默认Locale,手动指定固定使用0-9拉丁数字的Locale实例,从规则层面锁死数字输出形式,无论设备处于哪个区域,都不会出现阿拉伯数字格式的输出。
代码修改对照
原有问题代码:
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd", Locale.getDefault()); String currentDateandTime = df.format(new Date());
修复后代码,可按需调整格式模板匹配需要的输出样式:
// 指定Locale.US,强制使用拉丁数字,不受设备区域设置影响 // 模板"dd/MM/yyyy"对应输出17/04/2021格式,若需要横杠分隔可替换为"yyyy-MM-dd" SimpleDateFormat df = new SimpleDateFormat("dd/MM/yyyy", Locale.US); String currentDateandTime = df.format(new Date());
注意事项
- 不要使用无参构造的
SimpleDateFormat,该方法同样会默认跟随系统Locale,复现阿拉伯数字输出的问题 - 兼容Android API 26及以上版本时,优先使用
java.time包下的时间格式化能力,搭配公历纪年规则锁死输出:
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("dd/MM/yyyy", Locale.US) .withChronology(IsoChronology.INSTANCE); String currentDate = LocalDate.now().format(dtf);
- 低版本安卓可通过ThreeTenABP库复用上述
java.time的实现逻辑,长期来看格式输出的一致性比老版SimpleDateFormat更稳定
内容的提问来源于stack exchange,提问作者MustapTR
相关产品推荐
相关产品推荐

