Angular 12中如何将yyyyMMdd格式字符串转换为JavaScript Date对象
Angular 12 下解析yyyyMMdd格式日期字符串为Date对象的实现方案
无依赖原生实现(推荐,无需引入额外库)
不用零散写substring硬截字符串,用正则捕获组一次性完成格式校验和年、月、日字段提取,代码可读性和鲁棒性更好,不会因为截位位置写错出问题:
/** * 解析yyyyMMdd格式日期字符串为本地时间Date对象 * @param dateStr 格式为yyyyMMdd的日期字符串,例:20280328 */ function parseYyyyMmDd(dateStr: string): Date | null { // 正则同时做格式校验+字段捕获:必须是8位纯数字,前4位年、中间2位月、最后2位日 const regMatch = dateStr.match(/^(\d{4})(\d{2})(\d{2})$/); if (!regMatch) return null; const [, yearStr, monthStr, dayStr] = regMatch; const year = Number(yearStr); const month = Number(monthStr) - 1; // JS Date的月份从0开始计数,必须减1 const day = Number(dayStr); const targetDate = new Date(year, month, day); // 可选:增加合法性校验,避免传入20280230这类不存在的日期 if ( targetDate.getFullYear() !== year || targetDate.getMonth() !== month || targetDate.getDate() !== day ) { return null; } return targetDate; }
调用示例:
const date1 = parseYyyyMmDd('20280328'); // 输出:2028年3月28日的本地时间Date对象 const date2 = parseYyyyMmDd('20271201'); // 输出:2027年12月1日的本地时间Date对象
注意:绝对不要直接用
new Date(yyyymmddStr)或者Date.parse(yyyymmddStr)解析这类非标准格式,不同浏览器引擎对非标准日期字符串的解析逻辑不统一,很容易出现时区偏移、多算/少算8小时、返回Invalid Date等兼容问题。
基于现有日期库的实现(适合项目已引入日期工具的场景)
如果你的项目本身已经在使用date-fns、luxon这类日期处理库做其他日期逻辑,直接用库自带的自定义格式解析能力即可,不用自己写解析逻辑:
以date-fns为例:
import { parse } from 'date-fns'; // 直接指定输入格式即可完成解析 const date = parse('20280328', 'yyyyMMdd', new Date());
- 不建议为了这一个解析需求特意引入第三方日期库,优先用上面的原生实现即可。
关于Date.parse不支持自定义格式的说明
ECMAScript标准中从未给Date.parse()设计过自定义格式传参的能力,原生解析器仅保证对ISO 8601、RFC2822等标准日期格式的兼容,自定义格式解析不在原生API的支持范围内。
内容的提问来源于stack exchange,提问作者Matt W
相关产品推荐
相关产品推荐

