使用toLocaleString格式化时间偶现异常字符,求原因分析
解决toLocaleString格式化时间出现异常字符的问题
这问题我之前排查过类似的案例,你遇到的ý9ý:ý28ý ýAM这种异常字符,主要是下面这两个原因导致的:
1. 字符编码/数据源异常
如果你的entryTime是从接口、本地存储或者第三方文件中获取的,很可能在传输或存储过程中出现了编码不兼容的问题:
- 比如原本的ASCII字符(数字、冒号、空格)被错误地转换成了带重音的Unicode伪字符(像
ý是U+00FD,属于Latin-1扩展字符,而正常空格是U+0020); - 有些旧系统会混用UTF-8和ISO-8859-1编码,导致字符解析时出现乱码。
2. 宿主环境的Intl本地化数据损坏
部分浏览器(尤其是旧版本)或Node.js环境的Intl对象本地化数据可能存在bug,或者被第三方脚本/插件篡改了en-US的格式化规则,导致输出时插入了异常分隔符。
对应的解决方法:
清理异常字符:用正则表达式过滤掉非预期的字符,只保留时间相关的有效内容:
var options = { hour: 'numeric', minute: 'numeric', hour12: true }; var timeString = entryTime.toLocaleString('en-US', options); // 保留数字、冒号、AM/PM和正常空格,移除其他异常字符 const cleanedTime = timeString.replace(/[^0-9:APM ]/gi, '').trim();验证Date对象的合法性:先确认
entryTime是标准的Date对象,没有被篡改:console.log(entryTime.toString()); // 正常输出应该是类似 "Wed Sep 13 2023 09:28:00 GMT+0800 (China Standard Time)"如果输出异常,说明
entryTime本身的创建就有问题,需要先修复数据源的时间格式。替换Intl实现:如果是环境自带的
Intl有bug,可以引入@formatjs/intl-datetimeformatpolyfill,替换原生的格式化逻辑,避免环境问题:// 先安装依赖:npm install @formatjs/intl-datetimeformat import '@formatjs/intl-datetimeformat/polyfill'; import '@formatjs/intl-datetimeformat/locale-data/en'; var options = { hour: 'numeric', minute: 'numeric', hour12: true }; var timeString = new Intl.DateTimeFormat('en-US', options).format(entryTime);
内容的提问来源于stack exchange,提问作者Bidwell
相关产品推荐
相关产品推荐

