如何在JavaScript中将'{year:2018 month:12 day:5}'字符串转为日期?
解决非标准键值字符串转JSON的问题
方法1:用正则一次性补全引号和逗号
你的原正则存在无效分组($4),可以优化成一步到位的写法,同时完成键的引号添加和值后的逗号补全:
const rawStr = '{year: 2018 month: 12 day: 5}'; // 处理键的引号 + 给值后加逗号 + 清理末尾多余逗号 const validJson = rawStr .replace(/([a-zA-Z0-9_]+):/g, '"$1":') // 给所有键添加双引号 .replace(/(\d+)\s+(?=[a-zA-Z0-9_]+:)/g, '$1, ') // 在数字值后插入逗号 .replace(/,\s*$/, ''); // 移除最后一个键值对末尾的多余逗号 try { const dateObj = JSON.parse(validJson); // 注意JS的Date构造函数中月份是从0开始,需要减1 const targetDate = new Date(dateObj.year, dateObj.month - 1, dateObj.day); console.log(targetDate); } catch (err) { console.error('JSON转换失败:', err); }
方法2:用eval快速转换(仅适用于可信场景)
如果能确保字符串是安全的(比如自己生成、无用户输入),直接用eval转成对象比折腾JSON更高效:
const rawStr = '{year: 2018 month: 12 day: 5}'; // 用自执行函数包裹,避免污染全局变量 const dateObj = eval(`(() => (${rawStr}))()`); const targetDate = new Date(dateObj.year, dateObj.month - 1, dateObj.day); console.log(targetDate);
⚠️ 警告:如果字符串来自不可信来源(比如用户输入),绝对不能用eval,会存在代码注入风险。
方法3:手动拆分解析(格式固定时更可靠)
如果你的字符串格式始终是{key: val key: val}这种固定模式,手动拆分比正则更稳定,不会出现匹配遗漏的问题:
const rawStr = '{year: 2018 month: 12 day: 5}'; // 去掉首尾的{},按空格拆分键值对片段 const segments = rawStr.slice(1, -1).split(/\s+/); const dateObj = {}; for (let i = 0; i < segments.length; i += 2) { const key = segments[i].replace(':', ''); // 移除键末尾的冒号 dateObj[key] = parseInt(segments[i + 1], 10); // 将值转为数字类型 } const targetDate = new Date(dateObj.year, dateObj.month - 1, dateObj.day); console.log(targetDate);
内容的提问来源于stack exchange,提问作者UINoob
相关产品推荐
相关产品推荐

