Node.js版本差异导致日期时间分隔符从逗号变为'at'
日期格式化行为变化原因及解决方案
问题复现
升级Node.js从v14.18.0到v16.17.1后,Intl.DateTimeFormat在英文locale下的格式化结果出现差异,代码示例如下:
const format_options = { hour: '2-digit', minute: '2-digit', year: 'numeric', day: 'numeric', month: 'short' } const date = new Date('2022-09-28T12:00:00.000'); console.log(new Intl.DateTimeFormat('en', format_options).format(date)); // pre v16.17.0: Sep 28, 2022, 12:00 PM // post v16.17.0: Sep 28, 2022, 12:00 PM format_options.month = 'long'; console.log(new Intl.DateTimeFormat('en', format_options).format(date)); // pre v16.17.0: September 28, 2022, 12:00 PM // post v16.17.0: September 28, 2022 at 12:00 PM // ^
行为变化的原因
Node.js v16.17.0及之后版本同步了ICU(Unicode国际化组件)的规则更新。在英文locale下,ICU调整了日期时间组合的格式化逻辑:当使用month: 'long'展示完整月份名称时,为贴合英语母语的自然表达习惯,将日期与时间之间的分隔符从逗号改为了"at";而month: 'short'的短月份格式因属于更紧凑的表达,保留了原有的逗号分隔规则。这是国际化标准规范的调整,并非Node.js自身的自定义修改。
能否通过单一原生配置恢复原行为?
没有直接的单一配置项可以强制指定日期与时间的分隔符。Intl.DateTimeFormat的配置项仅控制年、月、日、时等单个时间组件的展示格式,分隔符这类连接元素是由对应locale的内置规则决定的,无法通过配置直接覆盖。
你提到的替换输出文本、分开格式化日期和时间后手动拼接的方案,是目前实现原格式的可行方式。如果坚持使用原生API,暂时没有更简洁的配置方案。
内容的提问来源于stack exchange,提问作者jaredk
相关产品推荐
相关产品推荐

