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
相关产品推荐
相关产品推荐

