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

Node.js从12.18.3升级至18.13.0后toLocaleString()性能骤降求助

Node.js 18.13.0下toLocaleString()在Windows服务中性能暴跌的解决办法

问题背景

我们将Windows环境下的Node.js从12.18.3升级至18.13.0后,发现toLocaleString("sv-SE", { month: "2-digit", year: "numeric", day: "2-digit" })的执行耗时变为之前的10倍。该问题仅在API作为Windows服务启动时出现,命令提示符中启动则性能正常。我们用这个函数生成指定日期区间的yyyy-MM-dd格式字符串数组。

可能原因

Node.js 16+版本对ICU(国际化组件)的加载逻辑做了调整,当以Windows服务身份运行时,进程可能无法正确初始化或缓存ICU本地化配置,导致每次调用toLocaleString都要重新加载本地化数据,而命令行启动时能正常复用缓存。


解决方案

方案1:替换toLocaleString为手动格式化(推荐)

因为目标格式是固定的yyyy-MM-dd,完全不需要依赖本地化函数,手动格式化性能更稳定,且不受环境/版本影响:

// 替换原toLocaleString调用的手动格式化函数
function formatISODate(date) {
  const year = date.getFullYear();
  // 月份从0开始,所以+1后补0
  const month = String(date.getMonth() + 1).padStart(2, '0');
  const day = String(date.getDate()).padStart(2, '0');
  return `${year}-${month}-${day}`;
}

// 在strDateArr中使用
let relDateStr = formatISODate(relDate);

方案2:预加载本地化配置,强制缓存

如果必须保留toLocaleString,可以在服务启动时提前初始化一次该函数,让Node.js缓存本地化配置,后续调用直接复用:

// 服务启动时执行一次,缓存sv-SE的本地化规则
new Date().toLocaleString("sv-SE", {
  month: "2-digit",
  year: "numeric",
  day: "2-digit",
});

方案3:调整Windows服务的运行环境

  • 检查服务的运行用户:将服务运行账户改为当前登录用户(而非Local System),确保进程能访问命令行用户环境下的ICU缓存路径。
  • 手动指定ICU数据目录:启动Node.js时添加--icu-data-dir参数,指向Node.js自带的ICU数据目录(通常在Node.js安装目录下的icudt*.dat文件路径)。

内容的提问来源于stack exchange,提问作者python_is_my_snake

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 05:55:14