You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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-datetimeformat polyfill,替换原生的格式化逻辑,避免环境问题:

    // 先安装依赖: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 08:06:55