You need to enable JavaScript to run this app. JavaScript不使用moment.js实现ISO字符串日期到指定格式的转换
优惠活动
大模型
产品
解决方案
定价
更多

JavaScript不使用moment.js实现ISO字符串日期到指定格式的转换

原生JS实现ISO日期到指定格式的转换方案

核心转换规则说明

从样例可直接推导转换对应关系:

  • 输入ISO格式:YYYY-MM-DDTHH:mm:ss.sssZ(UTC标准ISO字符串)
  • 目标输出格式:YYYY-MM-DD HH:mm:ss+sss

实现方案

方案1:纯字符串切割(优先推荐)

适用于输入严格符合带毫秒、带Z标记的标准ISO格式的场景,无Date解析开销,不会产生时区偏差。

function convertIsoToDbFormat(isoStr) {
  // 按毫秒分隔符拆分字符串
  const [timeBase, msPart] = isoStr.split('.');
  // 去掉毫秒部分末尾的Z标记
  const millisecond = msPart.slice(0, -1);
  // 按需补全毫秒为3位(若数据库要求固定长度)
  const paddedMs = millisecond.padStart(3, '0');
  // 替换T为空格后拼接结果
  return `${timeBase.replace('T', ' ')}+${paddedMs}`;
}

调用测试:convertIsoToDbFormat('2020-12-20T15:21:28.411Z') 输出为 '2020-12-20 15:21:28+411',完全匹配需求。

方案2:原生Date对象实现(兼容性更强)

适用于输入可能存在格式变体(比如不带毫秒、时区偏移非Z)的场景,需全程使用UTC方法避免本地时区转换。

function convertIsoToDbFormat(isoStr) {
  const date = new Date(isoStr);
  // 数字补零工具
  const pad = (num, length = 2) => String(num).padStart(length, '0');
  // 全部取UTC时间值,不做本地时区转换
  const year = date.getUTCFullYear();
  const month = pad(date.getUTCMonth() + 1);
  const day = pad(date.getUTCDate());
  const hour = pad(date.getUTCHours());
  const minute = pad(date.getUTCMinutes());
  const second = pad(date.getUTCSeconds());
  // 毫秒固定3位
  const ms = pad(date.getUTCMilliseconds(), 3);
  return `${year}-${month}-${day} ${hour}:${minute}:${second}+${ms}`;
}

为什么toLocaleString无法满足需求

  • toLocaleString的输出格式完全由运行时的本地化规则决定,无法自定义输出+毫秒这类非标准后缀
  • 默认会将UTC时间转换为本地时区时间,和需要保留原始ISO时间值的需求不匹配

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.11.11 20:36:04