如何将REST API返回的无效日期字符串转换为JavaScript Date
处理非标准格式的日期字符串:以"20180517T010237"为例
你的问题核心在于moment的格式串和输入的日期格式不匹配,先给你修复后的moment方案,再补充几个原生JS的简便方法,不用依赖库也能搞定。
修复后的Moment.js方案
你之前写的格式串"YYYY-MM-DD T HH.mm.ss"和输入的"20180517T010237"完全不对应——输入里没有分隔符(连字符、点号),也没有空格,所以必须严格按照输入的结构来写格式串:
let date = moment("20180517T010237", "YYYYMMDDTHHmmss").toDate();
这样moment就能正确识别这个日期字符串了,因为YYYYMMDD对应无分隔符的年月日,T是固定的分隔字符,HHmmss对应无分隔符的时分秒。
原生JavaScript方案(无需依赖库)
如果不想用moment,也可以直接通过字符串截取或正则解析来处理,毕竟这个日期格式是固定的结构:
方法1:字符串截取
利用固定位置直接提取年、月、日等部分,注意月份要减1(因为JS的Date对象月份是0-11):
const dateStr = "20180517T010237"; const date = new Date( dateStr.slice(0, 4), // 年:2018 dateStr.slice(4, 6) - 1, // 月:05 → 4(JS月份从0开始) dateStr.slice(6, 8), // 日:17 dateStr.slice(9, 11), // 时:01 dateStr.slice(11, 13), // 分:02 dateStr.slice(13, 15) // 秒:37 );
方法2:正则表达式提取
用正则匹配更灵活,也能顺便做格式校验:
const dateStr = "20180517T010237"; const regex = /^(\d{4})(\d{2})(\d{2})T(\d{2})(\d{2})(\d{2})$/; const matchResult = dateStr.match(regex); if (matchResult) { const [, year, month, day, hours, minutes, seconds] = matchResult; const date = new Date(year, month - 1, day, hours, minutes, seconds); // 处理date对象 } else { console.log("日期格式不符合预期"); }
这两种原生方法都能轻松搞定这种非标准的日期字符串,不用依赖第三方库。
内容的提问来源于stack exchange,提问作者Adam Jungen
相关产品推荐
相关产品推荐

