JavaScript中两类日期字符串类型识别及格式转换方法咨询
最优实现方案
1. 低兼容要求的极简原生实现(推荐)
利用ES2022新增的时区偏移格式化参数,仅需几行代码即可完成转换,不需要手动拆分字符串和正则匹配:
function convertDate(inputStr) { const date = new Date(inputStr); return date.toLocaleString('sv-SE', { year: 'numeric', month: '2-digit', day: '2-digit', hour: '2-digit', minute: '2-digit', second: '2-digit', timeZoneName: 'longOffset' }).replace(' ', 'T').replace('GMT', ''); } // 测试验证 const input = 'Fri Sep 17 2021 11:50:59 GMT-0400 (Eastern Daylight Time)'; console.log(convertDate(input) === '2021-09-17T11:50:59-04:00'); // 输出 true
sv-SE地区的日期格式默认为YYYY-MM-DD,符合ISO格式要求,longOffset参数会自动生成GMT±hh:mm格式的时区偏移,简单替换字符即可得到目标格式。
2. 全兼容原生实现
如果需要兼容IE、Node.js 16以下等低版本运行环境,可以通过日期内置方法直接计算,完全不需要正则:
function convertDate(inputStr) { const pad = (num) => String(num).padStart(2, '0'); const date = new Date(inputStr); // 计算时区偏移 const tzOffset = -date.getTimezoneOffset(); const tzSign = tzOffset >= 0 ? '+' : '-'; const tzHour = pad(Math.floor(Math.abs(tzOffset) / 60)); const tzMinute = pad(Math.abs(tzOffset) % 60); return `${date.getFullYear()}-${pad(date.getMonth() + 1)}-${pad(date.getDate())}T${pad(date.getHours())}:${pad(date.getMinutes())}:${pad(date.getSeconds())}${tzSign}${tzHour}:${tzMinute}`; }
3. 依赖库实现(稳定性最高)
如果项目允许引入第三方依赖,使用日期库可以避免不同浏览器对原生日期解析的兼容性差异,代码最简洁:
day.js 示例
import dayjs from 'dayjs'; import utc from 'dayjs/plugin/utc'; import timezone from 'dayjs/plugin/timezone'; dayjs.extend(utc); dayjs.extend(timezone); const input = 'Fri Sep 17 2021 11:50:59 GMT-0400 (Eastern Daylight Time)'; const output = dayjs(input).format('YYYY-MM-DDTHH:mm:ssZ'); // 直接得到目标格式
内容的提问来源于stack exchange,提问作者Dave Stein
相关产品推荐
相关产品推荐

