如何将字符串"Apr 28 2022 12:00AM"转换为日期?解决Date.parse返回NaN的问题
解决
Date.parse解析"Apr 28 2022 12:00AM"返回NaN的问题 嘿,我之前也碰到过Date.parse对这种格式不兼容的情况——这个方法的解析逻辑依赖JS引擎的实现,不同浏览器/环境对非标准日期格式的支持差异很大,所以才会返回NaN。给你几个可行的解决办法:
方法1:手动解析字符串(兼容性拉满)
自己拆分字符串的各个部分,用new Date()构造函数来创建日期对象,完全不依赖引擎的解析规则,稳得一批:
const dtstring = "Apr 28 2022 12:00AM"; // 拆分日期时间各部分 const [monthStr, dayStr, yearStr, timeStr] = dtstring.split(' '); // 月份缩写转成数字(JS里月份是0-11) const monthMap = { Jan: 0, Feb: 1, Mar: 2, Apr: 3, May: 4, Jun: 5, Jul: 6, Aug: 7, Sep: 8, Oct: 9, Nov: 10, Dec: 11 }; const month = monthMap[monthStr]; // 处理日期和年份 const day = parseInt(dayStr, 10); const year = parseInt(yearStr, 10); // 处理小时和AM/PM const hourStr = timeStr.slice(0, -2); const period = timeStr.slice(-2); let hour = parseInt(hourStr, 10); if (period === 'AM' && hour === 12) { hour = 0; // 12AM对应凌晨0点 } else if (period === 'PM' && hour !== 12) { hour += 12; // PM非12点的话加12转成24小时制 } // 创建日期对象 const dt = new Date(year, month, day, hour); console.log(dt); // 输出正确的Date实例 console.log(dt.getTime()); // 也能拿到对应的时间戳
方法2:调整字符串为标准可解析格式
如果不想写太多手动解析的代码,可以给原字符串加个小改动,改成Date.parse能稳定识别的格式:
const dtstring = "Apr 28 2022 12:00AM"; // 在年份前加个逗号,变成美式标准格式"Apr 28, 2022 12:00AM" const formattedString = dtstring.replace(/(\d{4})/, ', $1'); const dt = Date.parse(formattedString); console.log(dt); // 现在能正确返回时间戳了
大部分JS引擎对带逗号的美式日期格式支持都很好,这个小改动就能解决问题。
方法3:用第三方日期库(适合复杂场景)
如果你的项目经常要处理各种奇奇怪怪的日期格式,推荐用moment.js或者date-fns这类专业的日期库,它们的解析能力更强大且跨环境一致:
用moment.js的例子:
const dtstring = "Apr 28 2022 12:00AM"; // 指定解析格式,直接转成Date对象 const dt = moment(dtstring, 'MMM DD YYYY hh:mmA').toDate(); console.log(dt);
用date-fns的例子:
import { parse } from 'date-fns'; const dtstring = "Apr 28 2022 12:00AM"; // 传入格式模板解析 const dt = parse(dtstring, 'MMM dd yyyy hh:mmaa', new Date()); console.log(dt);
内容的提问来源于stack exchange,提问作者Shaun Marsh
相关产品推荐
相关产品推荐

