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构建,将会使用当前的时间进行格式化;
  • 更多功能请自行实现...
相关推荐
LinXunFeng5 小时前
Obsidian - 使用 Share Note 分享笔记并自部署
前端·笔记·github
乘风gg9 小时前
为什么AI 时代来临,大部分人吃不到红利
前端·ai编程·claude
恋猫de小郭9 小时前
Android 限制侧载新进展,谷歌联合国内厂商推验证计划
android·前端·flutter
IT_陈寒9 小时前
Redis内存爆了,原来我漏掉了这个致命配置
前端·人工智能·后端
恋猫de小郭9 小时前
解读 Android 17 全新内存限制,有没有“豁免”后门?
android·前端·flutter
Hyyy11 小时前
理解LLM的基本工作原理:预训练、微调、推理的区别
前端
Gatlin11 小时前
前端逆向与反逆向:一场猫鼠游戏的底层逻辑与实战
前端
Pedantic11 小时前
本地通知(Local Notifications)学习笔记
前端
森蓝情丶12 小时前
我给 AI 搭了个法庭:一个前端仔的 LangGraph 实战全记录
前端·后端
爱勇宝12 小时前
干了近 8 年,一夜之间被裁:AI 时代,程序员最该害怕的不是 AI
前端·后端·程序员