首页 > 其他分享 >前端TS 时间格式化函数

前端TS 时间格式化函数

时间:2025-01-18 09:30:51浏览次数:3  
标签:const string 前端 TS param date new Date 格式化

/**
 * 时间日期转换
 * @param date 当前时间,new Date() 格式
 * @param format 需要转换的时间格式字符串
 * @returns 返回拼接后的时间字符串
 */
export function formatDate(date: Date, format: string): string {
  const week: { [key: string]: string } = {
    '0': '日', '1': '一', '2': '二', '3': '三', '4': '四', '5': '五', '6': '六',
  };
  const quarter: { [key: string]: string } = { '1': '一', '2': '二', '3': '三', '4': '四' };

  const we = date.getDay(); // 星期
  const z = getWeek(date); // 周
  const qut = Math.floor((date.getMonth() + 3) / 3).toString(); // 季度

  const opt: { [key: string]: string } = {
    'Y+': date.getFullYear().toString(),
    'm+': (date.getMonth() + 1).toString(),
    'd+': date.getDate().toString(),
    'H+': date.getHours().toString(),
    'M+': date.getMinutes().toString(),
    'S+': date.getSeconds().toString(),
    'q+': quarter[qut], // 季度
  };

  // 处理格式中的特殊标记
  format = format.replace(/(W+)/, (match) => match.length > 1 ? `周${week[we]}` : week[we]);
  format = format.replace(/(Q+)/, (match) => match.length === 4 ? `第${quarter[qut]}季度` : quarter[qut]);
  format = format.replace(/(Z+)/, (match) => match.length === 3 ? `第${z}周` : `${z}`);

  // 替换日期格式中的部分
  Object.keys(opt).forEach((key) => {
    const reg = new RegExp(`(${key})`);
    format = format.replace(reg, (match) => match.length === 1 ? opt[key] : opt[key].padStart(match.length, '0'));
  });

  return format;
}

/**
 * 获取当前日期是第几周
 * @param dateTime 当前传入的日期值
 * @returns 返回第几周数字值
 */
export function getWeek(dateTime: Date): number {
  const temptTime = new Date(dateTime);
  const weekday = temptTime.getDay() || 7;  // 周几 (0-6,0代表星期天)
  
  // 调整日期到上周一
  temptTime.setDate(temptTime.getDate() - weekday + 1);
  const firstDay = new Date(temptTime.getFullYear(), 0, 1);

  // 获取第一周的第一天
  const dayOfWeek = firstDay.getDay();
  const spendDay = dayOfWeek === 0 ? 7 : 7 - dayOfWeek + 1;

  // 计算周数
  const startOfYear = new Date(temptTime.getFullYear(), 0, 1 + spendDay);
  const days = Math.ceil((temptTime.getTime() - startOfYear.getTime()) / 86400000);
  return Math.ceil(days / 7);
}

/**
 * 将时间转换为 `几秒前`、`几分钟前`、`几小时前`、`几天前`
 * @param param 当前时间,new Date() 格式或者字符串时间格式
 * @param format 需要转换的时间格式字符串
 * @returns 返回拼接后的时间字符串
 */
export function formatPast(param: string | Date, format: string = 'YYYY-mm-dd'): string {
  const time = new Date().getTime();
  let t = typeof param === 'string' || param instanceof Date ? new Date(param).getTime() : param;
  const diff = time - t;

  if (diff < 10000) return '刚刚';  // 10秒内
  if (diff < 60000) return `${Math.floor(diff / 1000)}秒前`;  // 少于1分钟
  if (diff < 3600000) return `${Math.floor(diff / 60000)}分钟前`;  // 少于1小时
  if (diff < 86400000) return `${Math.floor(diff / 3600000)}小时前`;  // 少于24小时
  if (diff < 259200000) return `${Math.floor(diff / 86400000)}天前`;  // 少于3天

  return formatDate(new Date(param), format);  // 超过3天
}

/**
 * 时间问候语
 * @param param 当前时间,new Date() 格式
 * @returns 返回拼接后的时间字符串
 */
export function formatAxis(param: Date): string {
  const hour = new Date(param).getHours();
  if (hour < 6) return '凌晨好';
  if (hour < 9) return '早上好';
  if (hour < 12) return '上午好';
  if (hour < 14) return '中午好';
  if (hour < 17) return '下午好';
  if (hour < 19) return '傍晚好';
  if (hour < 22) return '晚上好';
  return '夜里好';
}

/**
 * 日期格式化 (更简洁,兼容字符串和时间戳)
 * @param time 当前时间,string | number | Date
 * @param pattern 格式字符串
 * @returns 格式化后的日期字符串
 */
export function parseTime(time: string | number | Date, pattern: string = '{y}-{m}-{d} {h}:{i}:{s}'): string {
  const date = new Date(time);
  const formatObj = {
    y: date.getFullYear(),
    m: date.getMonth() + 1,
    d: date.getDate(),
    h: date.getHours(),
    i: date.getMinutes(),
    s: date.getSeconds(),
    a: date.getDay(),
  };
  return pattern.replace(/{(y|m|d|h|i|s|a)+}/g, (match, key) => {
    let value = formatObj[key];
    if (key === 'a') {
      return ['日', '一', '二', '三', '四', '五', '六'][value];
    }
    return value.toString().padStart(match.length, '0');
  });
}

/**
 * 日期格式化 (仅年月日)
 * @param time 当前时间,string | number | Date
 * @param pattern 格式字符串
 * @returns 格式化后的日期字符串
 */
export function parseDate(time: string | number | Date, pattern: string = '{y}-{m}-{d}'): string {
  return parseTime(time, pattern);
}

export const dateTimeStr: string = 'YYYY-MM-DD HH:mm:ss';
export const dateStr: string = 'YYYY-MM-DD';
export const timeStr: string = 'HH:mm:ss';

1. formatDate - 时间日期转换

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

参数:

  • dateDate 对象(例如:new Date())。
  • format:格式字符串,可以包含以下字符:
    • YYYY: 年(例如:2024)
    • MM: 月(例如:01)
    • DD: 日(例如:01)
    • HH: 小时(例如:12)
    • mm: 分钟(例如:30)
    • SS: 秒(例如:45)
    • W: 星期(例如:周一,星期一等)
    • Q: 季度(例如:第1季度)
    • Z: 周数(例如:第12周)

返回值:

  • 格式化后的日期字符串。

示例:

const date = new Date();
const format1 = 'YYYY-MM-DD';
console.log(formatDate(date, format1)); // 输出:2024-01-17

const format2 = 'YYYY-MM-DD HH:mm:ss';
console.log(formatDate(date, format2)); // 输出:2024-01-17 12:30:45

const format3 = 'YYYY-MM-DD HH:mm:ss QQQQ';
console.log(formatDate(date, format3)); // 输出:2024-01-17 12:30:45 第1季度

2. getWeek - 获取当前日期是第几周

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

参数:

  • dateTimeDate 对象(例如:new Date())。

返回值:

  • 当前日期是第几周(数字形式)。

示例:

const date = new Date('2024-01-17');
console.log(getWeek(date)); // 输出:3,表示是2024年的第3周

3. formatPast - 将时间转换为 几秒前几分钟前几小时前几天前

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

参数:

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

返回值:

  • 相对时间字符串(如:5分钟前)。

示例:

const date1 = new Date();
console.log(formatPast(date1)); // 输出:刚刚

const date2 = new Date('2024-01-15');
console.log(formatPast(date2)); // 输出:3天前

const date3 = new Date('2023-12-01');
console.log(formatPast(date3, 'YYYY-MM-DD')); // 输出:2023-12-01

4. formatAxis - 时间问候语

方法作用:
根据传入的时间,返回适合的问候语,例如:早上好下午好晚上好

参数:

  • paramDate 对象。

返回值:

  • 时间问候语字符串。

示例:

const date1 = new Date('2024-01-17T08:00:00');
console.log(formatAxis(date1)); // 输出:早上好

const date2 = new Date('2024-01-17T15:00:00');
console.log(formatAxis(date2)); // 输出:下午好

const date3 = new Date('2024-01-17T20:00:00');
console.log(formatAxis(date3)); // 输出:晚上好

5. parseTime - 日期格式化 (时间+日期)

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

参数:

  • time:传入的时间,支持 stringnumberDate 对象。
  • pattern:格式化字符串,默认是 '{y}-{m}-{d} {h}:{i}:{s}'。可以包含:
    • {y}:年份
    • {m}:月份
    • {d}:日
    • {h}:小时
    • {i}:分钟
    • {s}:秒
    • {a}:星期(中文)

返回值:

  • 格式化后的日期时间字符串。

示例:

const date1 = new Date('2024-01-17T12:30:45');
console.log(parseTime(date1, '{y}-{m}-{d} {h}:{i}:{s}')); // 输出:2024-01-17 12:30:45

const date2 = new Date('2024-01-17T12:30:45');
console.log(parseTime(date2, '{y}-{m}-{d} 星期{a}')); // 输出:2024-01-17 星期三

6. parseDate - 日期格式化 (仅年月日)

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

参数:

  • time:传入的时间,支持 stringnumberDate 对象。
  • pattern:格式化字符串,默认是 '{y}-{m}-{d}'

返回值:

  • 格式化后的日期字符串。

示例:

const date1 = new Date('2024-01-17T12:30:45');
console.log(parseDate(date1, '{y}-{m}-{d}')); // 输出:2024-01-17

const date2 = new Date('2024-01-17T12:30:45');
console.log(parseDate(date2)); // 输出:2024-01-17

其他常量

export const dateTimeStr: string = 'YYYY-MM-DD HH:mm:ss'; // 完整的日期时间格式
export const dateStr: string = 'YYYY-MM-DD';              // 仅日期格式
export const timeStr: string = 'HH:mm:ss';                // 仅时间格式

总结

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

 

标签:const,string,前端,TS,param,date,new,Date,格式化
From: https://blog.csdn.net/qq_39842184/article/details/145219505

相关文章

  • 【GMTSAR】虚拟机Ubuntu22.04使用GMTSAR进行D-InSAR和SBAS-InSAR处理
    近期学习了一下GMTSAR,记录一下使用过程电脑为处理器为i7-13700K,给虚拟机分配了32G内存。大致的处理流程命令如下(因为懒得截图以及复制起来简单直接写在了txt文本里)虚拟机挂载共享文件夹虚拟机的安装教程CSDN有很多,可以看最新的教程,去官网下载新版(但是要创建账号填写相关......
  • UTS Open '21 P7 - April Fools
    传送门前言本题是笔者keysky与同学yangbaich讨论+推式子一整个晚上以及讨论前ybc的一整个下午做出来的,综合起来是\(34\)个转移方程,对于整道题来说,贡献大抵为我\(2\)他\(8\)。我们的做法不一定是最优解,甚至可以说是较劣且复杂的,但时间是稳定能过且没卡常的,同时对于\(\tex......
  • 前端GIS三维开发必备——WebGL&Three&Cesium知识框架
    WebGL知识框架以下是一个关于WebGL知识框架,从入门到进阶的详细详解,帮助你系统性学习WebGL开发。该框架分为基础、核心、进阶、优化与工具四个部分。ICE图形学社区一、基础知识1.什么是WebGLWebGL定义与用途基于OpenGLES2.0的JavaScriptAPI用于在浏览......
  • MiniMax TTS新模型T2A-01-HD:情感控制10秒克隆限时免费;真人表演+文本命令,Kinetix精准生
      开发者朋友们大家好: 这里是**「RTE开发者日报」**,每天和大家一起看新闻、聊八卦。我们的社区编辑团队会整理分享RTE(Real-TimeEngagement)领域内「有话题的新闻」、「有态度的观点」、「有意思的数据」、「有思考的文章」、「有看点的会议」,但内容仅代表编......
  • 多壁碳纳米管(MWCNTs)添加到聚醚醚酮(PEEK)塑胶中,可以显著改善其力学、电学和热性能
    将多壁碳纳米管(MWCNTs)添加到聚醚醚酮(PEEK)塑胶中,可以显著改善PEEK的力学性能、电学性能和热性能等。然而,添加比例并非固定,而是需要依据不同的应用场景和性能需求来进行调整。以下为你详细介绍:改善力学性能增强目的:MWCNTs具有极高的强度和模量,添加到PEEK中可形成有效的增......
  • 前端包管理工具npm、pnpm 和 Yarn 的总结对比
    1.npmnpm是Node.js的官方包管理工具,长期以来是JavaScript生态系统的标准工具。它提供了丰富的功能,并且与所有Node.js项目兼容。优点:广泛的兼容性:npm是默认的包管理工具,与Node.js的所有版本兼容,适用于几乎所有JavaScript项目。庞大的生态系统:由于它是Node.j......
  • 前端 http学习笔记
    1.http全称是HyperTextTransferProtocol超文本传输协议2.TCP/IP协议栈分为应用层,传输层,网络层,数据链路层。HTTP工作在应用层。底层数据传输由TCPUDP负责3.HTTP的版本1.最常用的是HTTP/1.1 HTTP/2HTTP/32.HTTP/1.1依然在被广泛使用, http/2引入了多路复用,二进制帧......
  • 【前端进阶】在AI浪潮下前端如何结合应用于程序中,如:Brain.js创建模型
    前端和人工智能(AI)的结合可以创造非常丰富的用户体验,从简单的基于规则的交互到复杂的机器学习模型驱动的功能。在Web应用程序中集成AI可以增强用户交互、个性化内容推荐、图像和语音识别、自然语言处理等。前端与AI的结合应用聊天机器人(Chatbots):通过集成NLP(自然语言处理)技......
  • Flutter跨插件访问assets资源
    1.现在常常以插件话和组件化开发移动端,我们在使用原生访问flutter的Assets资源时常常可以这样写valflutterAssetStream=assetManager.open("flutter_assets/assets/my_flutter_asset.png")但是如果是跨插件的话可能就不行了,比如一个主项目可能引入了好几个问呢-----》使用......
  • 说说你对移动端和web前端开发的主要区别是什么?
    移动端开发和Web前端开发的主要区别体现在以下几个方面:运行平台:Web前端开发主要指传统的PC端网页开发,页面主要是运行在PC端浏览器中。移动前端开发则专注于移动设备,如手机和平板,其页面主要在这些设备的浏览器或应用中运行。技术适配性:Web前端在某些场景下需要兼容老版......