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构建,将会使用当前的时间进行格式化;
  • 更多功能请自行实现...
相关推荐
gnip3 小时前
Jst执行上下文栈和变量对象
前端·javascript
excel3 小时前
🐣 最简单的卷积与激活函数指南(带示例)
前端
醉方休4 小时前
npm/pnpm软链接的优点和使用场景
前端·npm·node.js
拉不动的猪4 小时前
简单回顾下Weakmap在vue中为何不能去作为循环数据源,以及替代方案
前端·javascript·vue.js
How_doyou_do4 小时前
数据传输优化-异步不阻塞处理增强首屏体验
开发语言·前端·javascript
奇舞精选4 小时前
超越Siri的耳朵:ASR与Whisper零代码部署实战指南
前端·人工智能·aigc
奇舞精选4 小时前
Nano Banana 如何为前端注入 AI 控制力
前端·aigc
一支鱼4 小时前
基于 Node.js 的短视频制作神器 ——FFCreator
前端·node.js·音视频开发
DT——4 小时前
前端登录鉴权详解
前端·javascript
李姆斯4 小时前
复盘上瘾症:到底什么时候该“复盘”,什么时候不需要“复盘”
前端·后端·团队管理