如何将yyyy-MM-dd HH:mm aa格式的日期字符串转换为ISOString
错误原因
- 你使用的
yyyy-MM-dd HH:mm aa日期格式不属于ECMAScript标准规定的Date构造器可直接解析的格式,不同浏览器的兼容实现差异很大,很容易解析失败 - 示例字符串
2021-11-21 13:19 PM本身存在逻辑冲突:13点已经是24小时制的下午时间,叠加PM标识会进一步干扰解析逻辑
解决方案
方案1:手动拆分解析(兼容性最佳,适配12小时制+AM/PM场景)
如果你的输入字符串的小时为12小时制,需要结合AM/PM标识转换,推荐直接手动拆分字段生成Date实例:
function parseCustomDate(dateStr) { const [datePart, timePart, period] = dateStr.split(' '); const [year, month, day] = datePart.split('-').map(Number); let [hour, minute] = timePart.split(':').map(Number); // 12小时制转24小时制逻辑 if (period.toUpperCase() === 'PM' && hour < 12) hour += 12; if (period.toUpperCase() === 'AM' && hour === 12) hour = 0; // 注意JS的月份是0基索引,需要减1 return new Date(year, month - 1, day, hour, minute); } // 测试调用 const event = parseCustomDate('2021-11-21 13:19 PM'); console.log(event.toISOString());
方案2:清理冗余标识后解析(适配24小时制场景)
如果确认输入字符串的小时已经是24小时制,末尾的AM/PM属于冗余标识,直接清理后即可正常解析:
const rawDateStr = '2021-11-21 13:19 PM'; // 移除末尾的AM/PM标识 const cleanedDateStr = rawDateStr.replace(/\s*[AP]M$/i, ''); const event = new Date(cleanedDateStr); console.log(event.toISOString());
内容的提问来源于stack exchange,提问作者ASimla
相关产品推荐
相关产品推荐

