cqwcns 发表于 2021-11-1 17:29

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

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

      /*
      函数功能:格式化日期时间,支持自定义格式,支持人性化显示(刚刚、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');

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

            // 如果到这里都未返回,则按 format 返回格式时间
            for (const key in config) {
                format = format.replace(key, config);
            }
            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的属性,不知道什么原因。
format = format.replace(/(YYYY|MM|DD|HH|mm|ss)/g, config['$&']);

webshi 发表于 2021-11-1 19:56

楼主写的还是不错的,定义 config 那里,在时分秒的处理上,建议封装一个函数处理

const formatHMS = num => `${num < 10? '0' : ''}${num}`

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

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

format.replace(/(YYYY|MM|DD|HH|mm|ss)/g, (key) => config)

rxxcy 发表于 2021-11-1 17:37

楼里楼气的了

CHANGCHEN 发表于 2021-11-1 17:46

??没有演示

cqwcns 发表于 2021-11-1 17:48

CHANGCHEN 发表于 2021-11-1 17:46
??没有演示

有调用示例哦

fan1191237272 发表于 2021-11-1 18:16

我平时项目直接用moment.js搞定所有{:301_1004:}

ly765893958 发表于 2021-11-1 18:21

rxxcy 发表于 2021-11-1 17:37
楼里楼气的了

漏里漏气可还行{:301_1001:}

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
});
页: [1] 2
查看完整版本: 分享一个自己写的JS日期时间格式化函数,欢迎讨论优化