吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 1785|回复: 15
收起左侧

[其他转载] 分享一个自己写的JS日期时间格式化函数,欢迎讨论优化

  [复制链接]
cqwcns 发表于 2021-11-1 17:29
web前端来说,基本上离不开日期时间格式,为了日常调用方便,自己写了一个函数,如有雷同,纯属巧合。
根据flexible参数是否为true,可以返回标准的格式化时间,或灵活的人性化显示时间,具体如下。
如有优化建议,欢迎各位大佬交流、指正。

[JavaScript] 纯文本查看 复制代码
        /*
        函数功能:格式化日期时间,支持自定义格式,支持人性化显示(刚刚、X分钟前、今天、今年)
        参数:
        data 需要处理的时间戳、时间日期字符串等
        format 自定义格式(有默认值)
        flexible 是否人性化模式
        */

        function formatDate(date, format = 'YYYY-MM-DD HH:mm:ss', flexible = false) {
            // 构建时间,并声明各时间变量(时分秒补零)
            date = new Date(date);
            const config = {
                YYYY: date.getFullYear(),
                MM: date.getMonth() + 1,
                DD: date.getDate(),
                HH: date.getHours() < 10 ? '0' + date.getHours() : date.getHours(),
                mm: date.getMinutes() < 10 ? '0' + date.getMinutes() : date.getMinutes(),
                ss: date.getSeconds() < 10 ? '0' + date.getSeconds() : date.getSeconds()
            };

            // 如果是人性化模式
            if (flexible) {

                // 构建现在时间,并计算现在时间与需处理时间的相差分钟数
                const now = new Date(),
                    count = ((now - date) / 1000 / 60);

                // 如果小于5分钟,则返回 “刚刚”
                if (count >= 0 && count < 5) {
                    return '刚刚';

                    // 如果小于60分钟,则返回 “*分钟前”
                } else if (count >= 5 && count < 60) {
                    return Math.round(count) + '分钟前';

                    // 如果是今天,则将 format 仅保留时、分、秒(未返回)
                } else if (date.toDateString() === now.toDateString()) {
                    format = 'HH' + format.split('HH')[1];

                    // 如果是今年,则将 format 仅保留月、日、时、分、秒(未返回)
                } else if (config.YYYY == now.getFullYear()) {
                    format = 'MM' + format.split('MM')[1];
                }
            }

            // 如果到这里都未返回,则按 format 返回格式时间
            for (const key in config) {
                format = format.replace(key, config[key]);
            }
            return format;
        }

        // ===== 调用 =====
        // 标准格式
        console.log(formatDate('2021-11-1 14:05:08', 'YYYY年MM月DD日 HH时mm分ss秒'));
        // 灵活格式
        console.log(formatDate('2020-8-6 9:01:06', 'YYYY年MM月DD日 HH:mm', true));



其实这里有个问题,就是最后的for循环替换那里,我尝试用正则实现一行代码完成替换,无法引用到config的属性,不知道什么原因
[JavaScript] 纯文本查看 复制代码
format = format.replace(/(YYYY|MM|DD|HH|mm|ss)/g, config['$&']);

免费评分

参与人数 3吾爱币 +3 热心值 +2 收起 理由
yf21001 + 1 用心讨论,共获提升!
kof21411 + 1 + 1 谢谢@Thanks!
blindcat + 1 + 1 用心讨论,共获提升!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

webshi 发表于 2021-11-1 19:56
楼主写的还是不错的,定义 config 那里,在时分秒的处理上,建议封装一个函数处理

[JavaScript] 纯文本查看 复制代码
const formatHMS = num => `${num < 10  ? '0' : ''}${num}`

const config = {
  // ...
  HH:  formatHMS(date.getHours())
}


关于楼主最后一个疑问,replace 函数的第二个参数其实是可以接受函数的,所以最后可以不用 for...in 循环,直接使用正则替换即可

[JavaScript] 纯文本查看 复制代码
format.replace(/(YYYY|MM|DD|HH|mm|ss)/g, (key) => config[key])

免费评分

参与人数 1吾爱币 +1 热心值 +1 收起 理由
cqwcns + 1 + 1 用心讨论,共获提升!

查看全部评分

rxxcy 发表于 2021-11-1 17:37
CHANGCHEN 发表于 2021-11-1 17:46
 楼主| cqwcns 发表于 2021-11-1 17:48

有调用示例哦
fan1191237272 发表于 2021-11-1 18:16
我平时项目直接用moment.js搞定所有
ly765893958 发表于 2021-11-1 18:21

漏里漏气可还行
lairuixu 发表于 2021-11-1 18:37
攒劲,支持,;厉害
minibeetuaman 发表于 2021-11-1 18:49
混淆一下吧,不然不习惯
blindcat 发表于 2021-11-1 19:18
感谢分享
魔幻冰扬 发表于 2021-11-1 19:34
format.replace(/(YYYY|MM|DD|HH|mm|ss)/g, function(m){
    return config[m]
});

免费评分

参与人数 1吾爱币 +1 热心值 +1 收起 理由
cqwcns + 1 + 1 用心讨论,共获提升!

查看全部评分

您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-25 11:36

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表