日期格式转换函数将YYYYMMDD转换YYYY-MM-DD

325 阅读3分钟

日期格式转换函数

这是一个日期格式转换函数,核心功能是将 YYYYMMDD 格式的字符串转换为带分隔符的日期(如 2023-12-25)。主要特点:

  1. 支持自定义分隔符(-/等)
  2. 自动清理输入中的非数字字符
  3. 空值返回可配置的占位符(默认---
  4. 严格校验8位数字格式

典型用途:标准化数据库日期、统一不同来源的日期格式等。通过选项对象参数保持扩展性。

支持自定义占位符的 convertDateFormat 函数优化

/**
 * 日期格式转换函数
 * @param dateString 输入日期字符串
 * @param options 配置选项
 * @param options.joint 分隔符,默认为'-'
 * @param options.placeholder 占位符,默认为'---'
 * @param options.inputFormat 输入格式,支持'YYYYMMDD'或'YYYY-MM-DD'等
 * @param options.outputFormat 输出格式,支持'YYYY-MM-DD'、'YYYY/MM/DD'、'YYYY年MM月DD日'等
 * @returns 格式化后的日期字符串
 * @throws 当输入格式不符合要求时抛出错误
 */
export function convertDateFormat(
  dateString: string,
  options: {
    joint?: string;
    placeholder?: string;
    inputFormat?: 'YYYYMMDD' | 'YYYY-MM-DD';
    outputFormat?: 'YYYY-MM-DD' | 'YYYY/MM/DD' | 'YYYY年MM月DD日';
  } = {}
): string {
  // 解构配置选项,设置默认值
  const {
    joint = '-',
    placeholder = '---',
    inputFormat = 'YYYYMMDD',
    outputFormat = 'YYYY-MM-DD'
  } = options;

  if (!dateString) return placeholder;
  
  // 根据输入格式清理输入字符串
  let cleanedDateString: string;
  if (inputFormat === 'YYYY-MM-DD') {
    // 验证带分隔符的格式
    const dateParts = dateString.split(/[-/]/);
    if (dateParts.length !== 3) {
      throw new Error('日期格式错误,不符合YYYY-MM-DD格式');
    }
    cleanedDateString = dateParts.join('');
  } else {
    // 默认处理无分隔符格式
    cleanedDateString = dateString.replace(/\D/g, '');
  }
  
  // 验证输入长度
  if (cleanedDateString.length !== 8) {
    throw new Error('日期格式错误,处理后不是8位数字');
  }
  
  // 提取年月日部分
  const year = cleanedDateString.slice(0, 4);
  const month = cleanedDateString.slice(4, 6);
  const day = cleanedDateString.slice(6, 8);
  
  // 根据输出格式返回结果
  switch (outputFormat) {
    case 'YYYY/MM/DD':
      return `${year}/${month}/${day}`;
    case 'YYYY年MM月DD日':
      return `${year}${month}${day}日`;
    case 'YYYY-MM-DD':
    default:
      return `${year}${joint}${month}${joint}${day}`;
  }
}

主要优化点

  1. 支持自定义占位符:通过 placeholder 选项可以自定义空值时的占位符
  2. 更灵活的配置:将所有选项合并到一个 options 对象参数中,提高可扩展性
  3. 更好的类型提示:使用 TypeScript 接口定义选项参数

使用示例

示例1:自定义占位符

convertDateFormat('', { placeholder: '无日期' }); // 返回: '无日期'

示例2:完整配置

convertDateFormat('20231225', {
  joint: '/',
  placeholder: '日期未知',
  outputFormat: 'YYYY/MM/DD'
}); // 返回: '2023/12/25'

示例3:默认配置

convertDateFormat('20231225'); // 返回: '2023-12-25'
convertDateFormat(''); // 返回: '---'

示例4:中文格式与自定义占位符

convertDateFormat(null, {
  outputFormat: 'YYYY年MM月DD日',
  placeholder: '暂无日期'
}); // 返回: '暂无日期'

参数说明

参数名类型默认值说明
dateStringstring-要转换的日期字符串
optionsobject{}配置选项对象
options.jointstring'-'日期部分之间的分隔符
options.placeholderstring'---'当输入为空时的占位文本
options.inputFormat'YYYYMMDD'、 'YYYY-MM-DD''YYYYMMDD'输入日期的格式
options.outputFormat'YYYY-MM-DD'、'YYYY/MM/DD'、'YYYY年MM月DD日''YYYY-MM-DD'输出日期的格式

使用建议

  1. 当需要处理可能为空的日期时,使用 placeholder 选项提供友好的占位显示
  2. 对于多语言应用,可以通过 placeholderoutputFormat 实现本地化日期显示
  3. 使用对象参数形式可以提高代码可读性,特别是需要配置多个选项时