JavaScript如何将Spring返回的非标准ISO时间字符串转为Epoch时间?
解决非标准ISO日期字符串转Epoch时间的问题
这个问题很常见——Java生成的日期格式和JS期望的标准ISO 8601格式略有差异,导致直接用new Date()解析会返回NaN。咱们一步步解决:
问题根源
JS的Date构造函数只识别带连字符的日期部分(YYYY-MM-DD)和带冒号的时区部分(±HH:mm),而你的字符串是YYYYMMDDTHH:mm:ss±HHmm,缺了这两个关键符号,所以解析失败。
解决方案1:手动修正格式(无依赖)
先把非标准字符串转换成JS能识别的标准格式,再解析成Date对象获取时间戳:
function getEpochFromCustomISO(isoString) { // 第一步:给日期部分添加连字符(20180410 → 2018-04-10) const formattedDate = isoString.slice(0,4) + '-' + isoString.slice(4,6) + '-' + isoString.slice(6,10); // 第二步:给时区部分添加冒号(+0000 → +00:00) const formattedTimeZone = isoString.slice(10).replace(/([+-]\d{2})(\d{2})$/, '$1:$2'); // 拼接成标准ISO字符串 const standardISO = formattedDate + formattedTimeZone; // 转换为Epoch时间(毫秒级) return new Date(standardISO).getTime(); } // 测试示例 const customISO = '20180410T11:55:37+0000'; console.log(getEpochFromCustomISO(customISO)); // 输出 1523351737000
解决方案2:正则一次性替换(更简洁)
用正则表达式一步完成格式修正,代码更紧凑:
const customISO = '20180410T11:55:37+0000'; // 同时修正日期和时区格式 const standardISO = customISO .replace(/^(\d{4})(\d{2})(\d{2})/, '$1-$2-$3') // 处理日期部分 .replace(/([+-]\d{2})(\d{2})$/, '$1:$2'); // 处理时区部分 const epochTime = new Date(standardISO).getTime(); console.log(epochTime); // 同样得到正确的时间戳
解决方案3:用日期库(推荐大型项目)
如果你的项目已经在用日期处理库(比如date-fns、luxon),可以直接用库的格式化解析能力,更省心:
以luxon为例:
import { DateTime } from 'luxon'; const customISO = '20180410T11:55:37+0000'; // 直接指定输入格式解析 const epochTime = DateTime.fromFormat(customISO, 'yyyyMMdd\'T\'HH:mm:ssZZ').toMillis(); console.log(epochTime);
额外提示
如果可以的话,也可以调整Java端的日期格式化代码,直接输出标准ISO 8601格式(比如用DateTimeFormatter.ISO_OFFSET_DATE_TIME),这样前端就不用额外处理啦。
内容的提问来源于stack exchange,提问作者Yash Jain
相关产品推荐
相关产品推荐

