用JS写一个格式化日期的函数

/**
 * 将时间转换为指定格式的字符串
 * @param {Date|string|number} time - 要转换的时间,可以是 Date 对象、表示时间的字符串或数字
 * @param {string} pattern - 转换的格式模式,默认为 '{yyyy}-{MM}-{dd} {HH}:{mm}:{ss}'
 * @returns {string} - 格式化后的时间字符串
 */
function parseTime(time, pattern = '{yyyy}-{MM}-{dd} {HH}:{mm}:{ss}') {

    if (!time) {
        throw new TypeError('illegal time value');
    }

    if (typeof pattern !== 'string') {
        throw new TypeError("'pattern' must be of type string");
    }

    if (pattern === "date") {
        pattern = '{yyyy}-{MM}-{dd}'
    } else if (pattern === "datetime") {
        pattern = '{yyyy}-{MM}-{dd} {HH}:{mm}:{ss}'
    }

    let date;
    // 将传入的time转为Date类型
    if (time instanceof Date) {
        date = time;
    } else if (typeof time === 'string') {
        // 如果是纯数字组成的字符串
        if (/^\d+$/.test(time)) {
            time = parseInt(time);
            date = new Date(time);
        } else {
            date = new Date(time);
            // Date与原始类型比较时会先调用toString
            if (date == 'Invalid Date') {
                throw new TypeError('unable to convert string');
            }
        }

    } else if (typeof time === 'number' && time >= 0) {
        // 如果是大于零的数字
        date = new Date(time)
    } else {
        throw new TypeError('unrecognized type');
    }

    const formatObj = {
        y: date.getFullYear(),
        M: date.getMonth() + 1,
        d: date.getDate(),
        H: date.getHours(),
        m: date.getMinutes(),
        s: date.getSeconds(),
        ms: date.getMilliseconds(),
        a: date.getDay()
    }

    const timeStr = pattern.replace(/{(y+|M+|d+|H+|m+|s+|ms|a)}/g, (result, key) => {
        let value;
        if (key === "ms") {
            return formatObj[key];
        } else if (key[0] === "y") {
            value = formatObj[key[0]];
            value = value % (10 ** key.length);
        } else if (key === "a") {
            value = formatObj[key];
            return ['日', '一', '二', '三', '四', '五', '六'][value];
        } else {
            value = formatObj[key[0]];
        }
        return value.toString().padStart(key.length, '0');
    })

    return timeStr;

}

第一步:将time转换为Date类型,分情况讨论。

如果time本身就是Date类型,直接赋值。

如果time是字符串且由纯数字组成,将字符串转成数字再调用构造函数。否则直接调用构造函数。

考虑转换失败的情况,Date与基本类型进行==判断时会先调用toString方法。

如果time是不小于0的数字,直接调用构造函数。

第二步:定义一个formatObj方便以后调用。

第三步:考虑pattern的特殊情况,如果pattern是"date"或"datetime",先将其转换为统一的格式。

第四步:模式替换。

注意点:正则表达式里的加号不能写在括号外面,就以y、s、ms为例。

const text = "{ysms}-{ss}-{yyys}";

paragraph.replace(/{(y|s|ms)+}/g, (result, key) => {
    console.log("result:", result, "key:", key);
});

/*
输出结果
> "result:" "{ysms}" "key:" "ms"
> "result:" "{ss}" "key:" "s"
> "result:" "{yyys}" "key:" "s"
*/

在正则表达式 {(y|s|ms)+} 中,+ 表示匹配前面的子表达式一次或多次。而 (y|s|ms) 是一个捕获组,表示匹配 y、s 或 ms 中的任何一个。

因此,表达式 {(y|s|ms)+} 可以匹配多次重复的 y、s 或 ms 组合。例如,它可以匹配 "yyyy", "ss", "msms", "ysys", "yssy", "yyys", 等等。

  • 5
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值