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构建,将会使用当前的时间进行格式化;
  • 更多功能请自行实现...
相关推荐
小彭努力中4 分钟前
205.Vue3 + OpenLayers:加载动画,采用 CSS 的 @keyframes 方式
前端·css·vue.js·openlayers·cesium·webgis
木斯佳7 分钟前
前端八股文面经大全:上海威派格前端实习(2026-05-07)·面经深度解析
前端
_Twink1e9 分钟前
基于Vue的纯前端的库存销售系统
前端·vue.js·vue·web
幽络源小助理16 分钟前
音频在线剪切助手网页版源码 – 纯前端HTML单文件免费分享
前端·音视频
陈振wx:zchen200816 分钟前
前端-面试题-Vue
前端·vue.js
计算机安禾18 分钟前
【c++面向对象编程】第5篇:类与对象(四):赋值运算符重载
java·前端·c++
Moment19 分钟前
从 beginWork 到 completeWork,Fiber 树是怎么“盖”出来的❓❓❓
前端·javascript·面试
Java面试题总结21 分钟前
.NET 8 Web开发入门(三):解构引擎——依赖注入(DI)与中间件管道
前端·中间件·.net
不会写DN24 分钟前
为什么需要 @types/react? 解决“无法找到模块 react 的声明文件”报错
前端·react.js·前端框架
右耳朵猫AI26 分钟前
React技术周刊 2026年第14周
前端·react.js·前端框架