旧版JavaScript字符串转Date报错,寻求有效转换方案
旧版JavaScript中ISO格式日期字符串转Date对象的解决方案
旧版JavaScript环境(比如不支持ES6语法的环境)对ISO 8601格式的日期字符串兼容性很差,直接用new Date(isoString)会返回Invalid Date。你可以通过手动解析字符串的时间分量,再用兼容性更好的Date构造函数来创建日期对象。
方案一:按本地时区解析日期
这个方法将字符串解析为本地时区的日期对象,兼容所有早期JS环境:
var tt = "2021-04-24T17:18:29.000"; function parseIsoDate(str) { // 拆分日期与时间部分 var dateTimeSplit = str.split('T'); var dateParts = dateTimeSplit[0].split('-'); var timeParts = dateTimeSplit[1].split(':'); // 拆分秒与毫秒 var secMsSplit = timeParts[2].split('.'); var seconds = parseInt(secMsSplit[0], 10); var milliseconds = secMsSplit.length > 1 ? parseInt(secMsSplit[1], 10) : 0; // 注意:JS中月份是0索引(0=1月,11=12月),需要减1 var year = parseInt(dateParts[0], 10); var month = parseInt(dateParts[1], 10) - 1; var day = parseInt(dateParts[2], 10); var hours = parseInt(timeParts[0], 10); var minutes = parseInt(timeParts[1], 10); return new Date(year, month, day, hours, minutes, seconds, milliseconds); } var createDate = parseIsoDate(tt); console.log(createDate); console.log(createDate.getDate()); // 输出24
方案二:按UTC时区解析日期(和Node.js环境结果一致)
如果需要和Node.js环境一样,将字符串解析为UTC时区的日期对象,可使用Date.UTC方法生成时间戳后创建Date:
var tt = "2021-04-24T17:18:29.000"; function parseIsoUtcDate(str) { var dateTimeSplit = str.split('T'); var dateParts = dateTimeSplit[0].split('-'); var timeParts = dateTimeSplit[1].split(':'); var secMsSplit = timeParts[2].split('.'); var seconds = parseInt(secMsSplit[0], 10); var milliseconds = secMsSplit.length > 1 ? parseInt(secMsSplit[1], 10) : 0; var year = parseInt(dateParts[0], 10); var month = parseInt(dateParts[1], 10) - 1; var day = parseInt(dateParts[2], 10); var hours = parseInt(timeParts[0], 10); var minutes = parseInt(timeParts[1], 10); // 生成UTC时间戳后创建Date对象 return new Date(Date.UTC(year, month, day, hours, minutes, seconds, milliseconds)); } var createDate = parseIsoUtcDate(tt); console.log(createDate); // 输出2021-04-24T17:18:29.000Z(和Node.js结果一致) console.log(createDate.getUTCDate()); // 输出24(获取UTC日期需用getUTCDate)
以上两种方法均不依赖环境对ISO格式的支持,完全通过手动解析实现,可在不支持let等ES6语法的旧JS环境中正常运行。
内容的提问来源于stack exchange,提问作者TulioVargas
相关产品推荐
相关产品推荐

