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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 21:45:02