JavaScript/Typescript日期时间格式化函数封装

适用说明

  • 场景:需要对时间进行格式化处理,但不能使用dayjsmoment三方库的情况;
  • 语言:javascripttypescript
  • 工程:前端工程、基于nodejs开发的后端工程;
  • 效果:支持任意效果的格式化,类似dayjs

代码实现

这里我们使用typescript实现,需要 js 版本的,请自行去除ts 的相关代码即可; 创建date.ts,放置于 utils 目录下:

typescript 复制代码
// 定义日期格式化选项的接口
interface DateFormatOptions {
    "M+": number; // 月份
    "d+": number; // 日
    "h+": number; // 小时
    "m+": number; // 分钟
    "s+": number; // 秒
    "q+": number; // 季度
    "S": number;  // 毫秒
}

/**
 * 格式化日期
 * @param date 要格式化的日期对象或日期字符串
 * @param fmt 格式字符串,例如 "yyyy-MM-dd hh:mm:ss"
 * @returns 格式化后的日期字符串
 */
export function formatDate(date: Date | string, fmt: string): string {
    try {
        date = new Date(date);
        // 如果日期无效,返回 'Invalid Date'
        if (isNaN(date.getTime())) return 'Invalid Date';
    } catch (e) {
        // 捕获错误,默认为当前日期
        date = new Date();
    }

    // 创建格式化选项映射
    const o: DateFormatOptions = {
        "M+": date.getMonth() + 1,                    // 月份
        "d+": date.getDate(),                         // 日
        "h+": date.getHours(),                        // 小时
        "m+": date.getMinutes(),                      // 分钟
        "s+": date.getSeconds(),                      // 秒
        "q+": Math.floor((date.getMonth() + 3) / 3),  // 季度
        "S": date.getMilliseconds()                   // 毫秒
    };

    // 处理年份 (y+)
    if (/(y+)/.test(fmt)) {
        // 将匹配到的年份部分替换为实际年份
        fmt = fmt.replace(RegExp.$1, date.getFullYear().toString().slice(4 - RegExp.$1.length));
    }

    // 处理其他日期格式部分
    for (const k in o) {
        if (new RegExp(`(${k})`).test(fmt)) {
            // 获取当前匹配的格式符,替换为对应值
            const value = o[k as keyof DateFormatOptions].toString();
            fmt = fmt.replace(RegExp.$1, RegExp.$1.length === 1 ? value : value.padStart(2, '0'));
        }
    }

    return fmt;
}

测试输出

日期 - 格式:年月日

javascript 复制代码
import { formatDate } from "@/utils/date";
const date = formatDate(new Date(),'yy年MM月dd日');
console.log(date); // 输出当前的年月日:如 2024年11月02日

日期 - 格式:-

javascript 复制代码
import { formatDate } from "@/utils/date";
const date = formatDate(new Date(),'yy-MM-dd');
console.log(date); // 输出当前的年月日:如 2024-11-02

日期 - 格式:只要年份 - 四位数年份

javascript 复制代码
import { formatDate } from "@/utils/date";
const date = formatDate(new Date(),'yyyy');
console.log(date); // 输出当前的年:如 2024

日期 - 格式:只要年份 - 两位数年份

javascript 复制代码
import { formatDate } from "@/utils/date";
const date = formatDate(new Date(),'yy');
console.log(date); // 输出当前的年:如 24

日期时间 - 完整的年月日时分秒

javascript 复制代码
import { formatDate } from "@/utils/date";
const date = formatDate(new Date(),'yyyy-MM-dd hh:mm:ss');
console.log(date); // 输出当前的完整时间:如 2024-11-02 20:09:14

日期时间 - 不需要格式化的分隔符

javascript 复制代码
import { formatDate } from "@/utils/date";
const date = formatDate(new Date(),'yyyyMMdd hhmmss');
console.log(date); // 输出当前的完整时间:如 20241102 200914

总结:

  • 日期时间连接的分隔符可以任意,不需要也可以不用填;
  • 可以单独的只要年份、月份、日期、时间...;
  • 如果传入的是非标准时间、或者不能被new Date构建,将会使用当前的时间进行格式化;
  • 更多功能请自行实现...
相关推荐
wulijuan88866611 小时前
ECharts图表性能优化的那些事
前端·javascript·echarts
❀͜͡傀儡师11 小时前
通过npm 手动安装、Docker 部署 OpenClaw小龙虾
前端·docker·npm
前端AI充电站12 小时前
Google 开始卷价格了:Gemini 3.1 Flash-Lite,会不会把 AI 应用成本真的打下来?
前端·人工智能
风止何安啊12 小时前
数字太长看花眼?一招教它排好队:千分位处理的实现
前端·javascript·面试
沙包大的拳头12 小时前
扩展运算符无法克隆 getBoundingClientRect() 获取的值
前端·javascript
忆江南12 小时前
# Flutter 语音房礼物下载方案(完整版)
前端
悟空瞎说12 小时前
React 19 带来了诸多创新
前端·react.js
im_AMBER12 小时前
高并发下的列表乱序与文档同步
前端·react.js·架构
前进的李工12 小时前
LangChain使用之Model IO(提示词模版之ChatPromptTemplate)
java·前端·人工智能·python·langchain·大模型