前端TS 时间格式化函数

打印 上一主题 下一主题

主题 962|帖子 962|积分 2888

  1. /**
  2. * 时间日期转换
  3. * @param date 当前时间,new Date() 格式
  4. * @param format 需要转换的时间格式字符串
  5. * @returns 返回拼接后的时间字符串
  6. */
  7. export function formatDate(date: Date, format: string): string {
  8.   const week: { [key: string]: string } = {
  9.     '0': '日', '1': '一', '2': '二', '3': '三', '4': '四', '5': '五', '6': '六',
  10.   };
  11.   const quarter: { [key: string]: string } = { '1': '一', '2': '二', '3': '三', '4': '四' };
  12.   const we = date.getDay(); // 星期
  13.   const z = getWeek(date); // 周
  14.   const qut = Math.floor((date.getMonth() + 3) / 3).toString(); // 季度
  15.   const opt: { [key: string]: string } = {
  16.     'Y+': date.getFullYear().toString(),
  17.     'm+': (date.getMonth() + 1).toString(),
  18.     'd+': date.getDate().toString(),
  19.     'H+': date.getHours().toString(),
  20.     'M+': date.getMinutes().toString(),
  21.     'S+': date.getSeconds().toString(),
  22.     'q+': quarter[qut], // 季度
  23.   };
  24.   // 处理格式中的特殊标记
  25.   format = format.replace(/(W+)/, (match) => match.length > 1 ? `周${week[we]}` : week[we]);
  26.   format = format.replace(/(Q+)/, (match) => match.length === 4 ? `第${quarter[qut]}季度` : quarter[qut]);
  27.   format = format.replace(/(Z+)/, (match) => match.length === 3 ? `第${z}周` : `${z}`);
  28.   // 替换日期格式中的部分
  29.   Object.keys(opt).forEach((key) => {
  30.     const reg = new RegExp(`(${key})`);
  31.     format = format.replace(reg, (match) => match.length === 1 ? opt[key] : opt[key].padStart(match.length, '0'));
  32.   });
  33.   return format;
  34. }
  35. /**
  36. * 获取当前日期是第几周
  37. * @param dateTime 当前传入的日期值
  38. * @returns 返回第几周数字值
  39. */
  40. export function getWeek(dateTime: Date): number {
  41.   const temptTime = new Date(dateTime);
  42.   const weekday = temptTime.getDay() || 7;  // 周几 (0-6,0代表星期天)
  43.   
  44.   // 调整日期到上周一
  45.   temptTime.setDate(temptTime.getDate() - weekday + 1);
  46.   const firstDay = new Date(temptTime.getFullYear(), 0, 1);
  47.   // 获取第一周的第一天
  48.   const dayOfWeek = firstDay.getDay();
  49.   const spendDay = dayOfWeek === 0 ? 7 : 7 - dayOfWeek + 1;
  50.   // 计算周数
  51.   const startOfYear = new Date(temptTime.getFullYear(), 0, 1 + spendDay);
  52.   const days = Math.ceil((temptTime.getTime() - startOfYear.getTime()) / 86400000);
  53.   return Math.ceil(days / 7);
  54. }
  55. /**
  56. * 将时间转换为 `几秒前`、`几分钟前`、`几小时前`、`几天前`
  57. * @param param 当前时间,new Date() 格式或者字符串时间格式
  58. * @param format 需要转换的时间格式字符串
  59. * @returns 返回拼接后的时间字符串
  60. */
  61. export function formatPast(param: string | Date, format: string = 'YYYY-mm-dd'): string {
  62.   const time = new Date().getTime();
  63.   let t = typeof param === 'string' || param instanceof Date ? new Date(param).getTime() : param;
  64.   const diff = time - t;
  65.   if (diff < 10000) return '刚刚';  // 10秒内
  66.   if (diff < 60000) return `${Math.floor(diff / 1000)}秒前`;  // 少于1分钟
  67.   if (diff < 3600000) return `${Math.floor(diff / 60000)}分钟前`;  // 少于1小时
  68.   if (diff < 86400000) return `${Math.floor(diff / 3600000)}小时前`;  // 少于24小时
  69.   if (diff < 259200000) return `${Math.floor(diff / 86400000)}天前`;  // 少于3天
  70.   return formatDate(new Date(param), format);  // 超过3天
  71. }
  72. /**
  73. * 时间问候语
  74. * @param param 当前时间,new Date() 格式
  75. * @returns 返回拼接后的时间字符串
  76. */
  77. export function formatAxis(param: Date): string {
  78.   const hour = new Date(param).getHours();
  79.   if (hour < 6) return '凌晨好';
  80.   if (hour < 9) return '早上好';
  81.   if (hour < 12) return '上午好';
  82.   if (hour < 14) return '中午好';
  83.   if (hour < 17) return '下午好';
  84.   if (hour < 19) return '傍晚好';
  85.   if (hour < 22) return '晚上好';
  86.   return '夜里好';
  87. }
  88. /**
  89. * 日期格式化 (更简洁,兼容字符串和时间戳)
  90. * @param time 当前时间,string | number | Date
  91. * @param pattern 格式字符串
  92. * @returns 格式化后的日期字符串
  93. */
  94. export function parseTime(time: string | number | Date, pattern: string = '{y}-{m}-{d} {h}:{i}:{s}'): string {
  95.   const date = new Date(time);
  96.   const formatObj = {
  97.     y: date.getFullYear(),
  98.     m: date.getMonth() + 1,
  99.     d: date.getDate(),
  100.     h: date.getHours(),
  101.     i: date.getMinutes(),
  102.     s: date.getSeconds(),
  103.     a: date.getDay(),
  104.   };
  105.   return pattern.replace(/{(y|m|d|h|i|s|a)+}/g, (match, key) => {
  106.     let value = formatObj[key];
  107.     if (key === 'a') {
  108.       return ['日', '一', '二', '三', '四', '五', '六'][value];
  109.     }
  110.     return value.toString().padStart(match.length, '0');
  111.   });
  112. }
  113. /**
  114. * 日期格式化 (仅年月日)
  115. * @param time 当前时间,string | number | Date
  116. * @param pattern 格式字符串
  117. * @returns 格式化后的日期字符串
  118. */
  119. export function parseDate(time: string | number | Date, pattern: string = '{y}-{m}-{d}'): string {
  120.   return parseTime(time, pattern);
  121. }
  122. export const dateTimeStr: string = 'YYYY-MM-DD HH:mm:ss';
  123. export const dateStr: string = 'YYYY-MM-DD';
  124. export const timeStr: string = 'HH:mm:ss';
复制代码

1. formatDate - 时间日期转换

方法作用:
根据传入的 Date 对象和指定的时间格式,返回格式化后的时间字符串。支持 YYYY, MM, DD, HH, MM, SS 等格式化符号,还可以格式化季度 (Q)、星期 (W) 和几周 (Z)。
参数:


  • date:Date 对象(比方:new Date())。
  • format:格式字符串,可以包罗以下字符:




    • YYYY: 年(比方:2024)
    • MM: 月(比方:01)
    • DD: 日(比方:01)
    • HH: 小时(比方:12)
    • mm: 分钟(比方:30)
    • SS: 秒(比方:45)
    • W: 星期(比方:周一,星期一等)
    • Q: 季度(比方:第1季度)
    • Z: 周数(比方:第12周)

返回值:


  • 格式化后的日期字符串。
示例:
  1. const date = new Date();
  2. const format1 = 'YYYY-MM-DD';
  3. console.log(formatDate(date, format1)); // 输出:2024-01-17
  4. const format2 = 'YYYY-MM-DD HH:mm:ss';
  5. console.log(formatDate(date, format2)); // 输出:2024-01-17 12:30:45
  6. const format3 = 'YYYY-MM-DD HH:mm:ss QQQQ';
  7. console.log(formatDate(date, format3)); // 输出:2024-01-17 12:30:45 第1季度
复制代码
2. getWeek - 获取当前日期是第几周

方法作用:
根据传入的日期,返回该日期是当前年份的第几周。
参数:


  • dateTime:Date 对象(比方:new Date())。
返回值:


  • 当前日期是第几周(数字情势)。
示例:
  1. const date = new Date('2024-01-17');
  2. console.log(getWeek(date)); // 输出:3,表示是2024年的第3周
复制代码
3. formatPast - 将时间转换为 几秒前几分钟前几小时前几天前

方法作用:
根据传入的时间,返回一个“相对时间”的字符串,表示间隔当前时间的时间差。比方:刚刚, 5分钟前, 2小时前, 3天前。
参数:


  • param:传入的时间,可以是 Date 对象或字符串。
  • format:可选的格式化字符串,默认是 'YYYY-mm-dd'。
返回值:


  • 相对时间字符串(如:5分钟前)。
示例:
  1. const date1 = new Date();
  2. console.log(formatPast(date1)); // 输出:刚刚
  3. const date2 = new Date('2024-01-15');
  4. console.log(formatPast(date2)); // 输出:3天前
  5. const date3 = new Date('2023-12-01');
  6. console.log(formatPast(date3, 'YYYY-MM-DD')); // 输出:2023-12-01
复制代码
4. formatAxis - 时间问候语

方法作用:
根据传入的时间,返回适合的问候语,比方:早上好、下午好、晚上好。
参数:


  • param:Date 对象。
返回值:


  • 时间问候语字符串。
示例:
  1. const date1 = new Date('2024-01-17T08:00:00');
  2. console.log(formatAxis(date1)); // 输出:早上好
  3. const date2 = new Date('2024-01-17T15:00:00');
  4. console.log(formatAxis(date2)); // 输出:下午好
  5. const date3 = new Date('2024-01-17T20:00:00');
  6. console.log(formatAxis(date3)); // 输出:晚上好
复制代码
5. parseTime - 日期格式化 (时间+日期)

方法作用:
根据传入的时间和格式,返回格式化后的日期时间字符串。支持自界说格式,可以格式化为年、月、日、小时、分钟、秒等。
参数:


  • time:传入的时间,支持 string、number 或 Date 对象。
  • pattern:格式化字符串,默认是 '{y}-{m}-{d} {h}:{i}:{s}'。可以包罗:




    • {y}:年份
    • {m}:月份
    • {d}:日
    • {h}:小时
    • {i}:分钟
    • {s}:秒
    • {a}:星期(中文)

返回值:


  • 格式化后的日期时间字符串。
示例:
  1. const date1 = new Date('2024-01-17T12:30:45');
  2. console.log(parseTime(date1, '{y}-{m}-{d} {h}:{i}:{s}')); // 输出:2024-01-17 12:30:45
  3. const date2 = new Date('2024-01-17T12:30:45');
  4. console.log(parseTime(date2, '{y}-{m}-{d} 星期{a}')); // 输出:2024-01-17 星期三
复制代码
6. parseDate - 日期格式化 (仅年月日)

方法作用:
根据传入的时间,返回格式化后的年月日字符串。类似于 parseTime,但只处理日期部分。
参数:


  • time:传入的时间,支持 string、number 或 Date 对象。
  • pattern:格式化字符串,默认是 '{y}-{m}-{d}'。
返回值:


  • 格式化后的日期字符串。
示例:
  1. const date1 = new Date('2024-01-17T12:30:45');
  2. console.log(parseDate(date1, '{y}-{m}-{d}')); // 输出:2024-01-17
  3. const date2 = new Date('2024-01-17T12:30:45');
  4. console.log(parseDate(date2)); // 输出:2024-01-17
复制代码
其他常量

  1. export const dateTimeStr: string = 'YYYY-MM-DD HH:mm:ss'; // 完整的日期时间格式
  2. export const dateStr: string = 'YYYY-MM-DD';              // 仅日期格式
  3. export const timeStr: string = 'HH:mm:ss';                // 仅时间格式
复制代码
总结



  • formatDate 用于将 Date 格式化为指定格式的字符串,支持多种日期格式(如季度、星期等)。
  • getWeek 用于获取当前日期是该年份的第几周。
  • formatPast 用于将日期转换为“几秒前”、“几分钟前”等相对时间格式。
  • formatAxis 用于返回基于时间的问候语。
  • parseTimeparseDate 用于根据传入时间返回格式化后的日期字符串,parseTime 返回时间和日期,parseDate 仅返回日期。
    
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

用多少眼泪才能让你相信

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表