在前端开发的实际需求中,我们经常会遇到需要从一段字符串里提取出日期范围,并且把提取到的日期转换成指定格式的场景,比如处理用户填写的备注信息、解析接口返回的文本内容等。不同场景下的字符串格式差异很大,需要选择合适的提取方式才能保证准确性。

方案一:使用正则表达式提取日期范围
如果字符串中的日期范围格式相对固定,比如格式为2024-01-01至2024-01-31、2024/01/01 - 2024/01/31这类有明确分隔符和统一日期格式的内容,使用正则表达式匹配是最直接的方式。
实现步骤
- 先编写匹配单个日期的正则规则,适配常见的日期格式
- 编写匹配日期范围的正则,捕获开始日期和结束日期
- 对捕获到的日期字符串进行格式化处理
代码示例
以下代码实现了从字符串中提取YYYY-MM-DD格式的日期范围,并格式化为YYYY年MM月DD日的需求:
// 定义匹配日期范围的正则,适配 至、到、- 等分隔符
const dateRangeReg = /(d{4}[-/]d{1,2}[-/]d{1,2})s*(?:至|到|-)s*(d{4}[-/]d{1,2}[-/]d{1,2})/;
// 待处理的字符串
const testStr = '本次活动的有效时间是2023-10-01至2023-10-07,请按时参与';
// 提取日期范围
const matchResult = testStr.match(dateRangeReg);
if (matchResult) {
const startDateStr = matchResult[1];
const endDateStr = matchResult[2];
console.log('提取到的开始日期:', startDateStr);
console.log('提取到的结束日期:', endDateStr);
// 日期格式化函数,将 YYYY-MM-DD 转为 YYYY年MM月DD日
function formatDate(dateStr) {
const date = new Date(dateStr);
// 注意月份需要加1,因为Date对象的月份从0开始计数
const year = date.getFullYear();
const month = String(date.getMonth() + 1).padStart(2, '0');
const day = String(date.getDate()).padStart(2, '0');
return `${year}年${month}月${day}日`;
}
const formattedStart = formatDate(startDateStr);
const formattedEnd = formatDate(endDateStr);
console.log('格式化后的日期范围:', `${formattedStart} 到 ${formattedEnd}`);
} else {
console.log('未匹配到有效的日期范围');
}
方案二:使用字符串分割提取日期范围
如果日期范围的分隔符非常明确,且日期格式固定,也可以使用字符串的split方法直接分割提取,这种方式逻辑更简单,适合格式高度统一的场景。
代码示例
以下代码处理格式为开始日期|结束日期的字符串,提取并格式化日期:
// 待处理的字符串,日期格式为 YYYY/MM/DD
const fixedStr = '2023/12/01|2023/12/15';
// 使用 | 分割字符串得到两个日期
const dateArr = fixedStr.split('|');
if (dateArr.length === 2) {
const startDateStr = dateArr[0];
const endDateStr = dateArr[1];
// 格式化函数,适配 / 分隔的日期
function formatSlashDate(dateStr) {
const parts = dateStr.split('/');
if (parts.length === 3) {
const year = parts[0];
// 月份和日期补零到两位
const month = parts[1].padStart(2, '0');
const day = parts[2].padStart(2, '0');
return `${year}年${month}月${day}日`;
}
return dateStr;
}
const formattedStart = formatSlashDate(startDateStr);
const formattedEnd = formatSlashDate(endDateStr);
console.log('格式化后的日期范围:', `${formattedStart} 至 ${formattedEnd}`);
}
常见问题说明
- 月份偏移问题:JavaScript的
Date对象中月份是从0开始计数的,1月对应0,12月对应11,所以获取月份后需要加1才能得到实际的月份。 - 日期合法性校验:提取到日期字符串后,建议校验日期是否合法,比如可以创建
Date对象后判断其时间戳是否为NaN,避免处理无效日期。 - 时区问题:如果字符串中的日期是UTC时间,需要使用
Date.UTC相关方法处理,避免本地时区导致日期偏移。
总结
从字符串中提取并格式化日期范围的核心是先明确字符串中日期的格式和分隔规则,再选择正则匹配或者字符串分割的方式提取内容,最后通过自定义格式化函数转换成需要的格式。两种方案各有适用场景,正则方式更灵活适配多种格式,字符串分割方式更简单适合固定格式的场景,开发者可以根据实际需求选择使用。
JavaScript日期提取日期格式化字符串处理正则匹配修改时间:2026-07-22 12:24:25