参数归一化-实现时间格式化

文章目录

    • 需求分析
    • 具体实现
    • 完整源码

不知道大家有没有尝试封装过一个时间格式化的函数啊,在之前我封装的时候,开始是觉得手到擒来,但是实践之后发现写非常的shi啊,大量的分支判断,哪怕是映射起到的作用也只是稍微好一点,不过比较好的是,当天晚上我就看见了袁教头的参数归一化讲解啊,立马就让我眼界大开,如果你也不知道,就一起来看一下

需求分析

  1. 时间格式化,一个基础的知识,也没有什么难度,但是如果要变得通用一点,那么就不是那么容易处理了

  2. 由这个参数最为难搞,比如存在一个 formatDateTime 方法,使用如下:

    // 日期 2023-12-29
    formatDateTime(new Date(), 'date')// 日期时间 2023-12-29 6:23:3
    formatDateTime(new Date(), 'dateTime')// 年月日时分秒[不补0] 2023-12-29 6:23:3
    formatDateTime(new Date(), 'yyyy-MM-dd HH:mm:ss')// 年月日时分秒 2023-12-29 06:23:03
    formatDateTime(new Date(), 'yyyy-MM-dd HH:mm:ss', true)// 年月日时分秒毫秒 2023-12-29 06:23:03:015
    formatDateTime(new Date(), 'yyyy-MM-dd HH:mm:ss:ms', true)// 自定义函数处理
    formatDateTime(new Date(), dateInfo => {// ...
    })
    
  3. 那诸如这些情况,怎么写呢,最简单粗暴的就莫过于 if 判断了,但是这种判断写起来的话可想而知

  4. 所以应该怎么处理呢?其实仔细看一下,这些参数无论是 date 还是 dateTime 或者其他,最后无非就是要得到一个格式化后的时间,那么这一步都是可以通过一个函数来处理完成的,所以我们首先第一步就是搞定,无论参数是什么情况,都将其转化为一个函数,而这种将不同的情况转换为一种情况,就是参数归一化

具体实现

  1. 我们上面列举的参数大致可以分为传递的函数和字符串,字符串又分为固定的词汇和用户传入一些自定义的时间格式,但是 yyyy-MM-dd HH:mm:ss 这种情况是可以将 date、dateTime 也包含在内的,所以如果我们可以将这个 date 转为 yyyy-MM-dd,将 dateTime 转为 yyyy-MM-dd HH:mm:ss 是不是就可以将多种情况变为一种情况了

  2. 要完成这个参数的归一,我们需要一个辅助函数,这个函数会返回给我们一个函数,定义函数 _format,如下:

    function _format(format) {}function formatDateTime(date, format, isPad) {const f = _format(format)
    }
    
  3. 那么 _format 函数应该怎么实现呢?首先判断类型,传入的参数是否是一个函数,如果是一个函数则直接返回,在判断是否是一个字符串,如果是字符串在将 date 和 dateTime 变为自定义的格式,如下:

    function _format(format) {if (typeof format === 'function') {return format}if (typeof format !== 'string') {throw new Error('format must be string or function')}if (format === 'date') {format = 'yyyy-MM-dd'}if (format === 'dateTime') {format = 'yyyy-MM-dd HH:mm:ss'}
    }
    
  4. 此时我们就已经将参数都处理为一种情况了。现在就是返回一个函数来出来这个结果,怎么处理呢?那只能是你给我一些数据,比如 year、month… 等等这些信息,然后我这个返回的函数内部替换一下即可,如下:

    function _format(format) {if (typeof format === 'function') {return format}if (typeof format !== 'string') {throw new Error('format must be string or function')}if (format === 'date') {format = 'yyyy-MM-dd'}if (format === 'dateTime') {format = 'yyyy-MM-dd HH:mm:ss'}const result = dateInfo => {const { year, month, day, hour, minute, second, millisecond } = dateInforeturn format.replaceAll('yyyy', year).replaceAll('MM', month).replaceAll('dd', day).replaceAll('HH', hour).replaceAll('mm', minute).replaceAll('ss', second).replaceAll('ms', millisecond)}return result
    }
    
  5. 可以看到,我们需要返回的这个函数,需要接收一些数据,那这些是不是就很好处理了呢,如下:

    function isDate(value) {return value instanceof Date
    }function formatDateTime(date, format, isPad) {// 判断传递的 date 是否是一个时间对象date = isDate(date) ? date : new Date(date)// 如果 date 为 Invalid Date 就报错if (isNaN(date.getTime())) {throw new Error('Invalid Date')}const f = _format(format)// 得到 year, month, day, hour, minute, second, millisecondconst dateInfo = {year: date.getFullYear().toString(),month: (date.getMonth() + 1).toString(),day: date.getDate().toString(),hour: date.getHours().toString(),minute: date.getMinutes().toString(),second: date.getSeconds().toString(),millisecond: date.getMilliseconds().toString()}
    }
    
  6. 此时我们还需要对这些数据进行进一步的处理,比如是否补零,如下:

    function formatDateTime(date, format, isPad) {// 判断传递的 date 是否是一个时间对象date = isDate(date) ? date : new Date(date)// 如果 date 为 Invalid Date 就报错if (isNaN(date.getTime())) {throw new Error('Invalid Date')}const f = _format(format)// 得到 year, month, day, hour, minute, second, millisecondconst dateInfo = {year: date.getFullYear().toString(),month: (date.getMonth() + 1).toString(),day: date.getDate().toString(),hour: date.getHours().toString(),minute: date.getMinutes().toString(),second: date.getSeconds().toString(),millisecond: date.getMilliseconds().toString()}function _isPad(prop, len) {dateInfo[prop] = dateInfo[prop].padStart(len, '0')}// 是否补零if (isPad) {_isPad('year', 4)_isPad('month', 2)_isPad('day', 2)_isPad('hour', 2)_isPad('minute', 2)_isPad('second', 2)_isPad('millisecond', 3)}return f(dateInfo)
    }
    
  7. 结果如图:

    在这里插入图片描述

  8. 来看看传递函数的结果,如图:

在这里插入图片描述

  1. 基于此,我们还可以更换分割符使用,如下:

    在这里插入图片描述

  2. 怎么样,这样是不是对比直接使用 if 来判断参数格式化,要优雅不少呢

完整源码

function _format(format) {if (typeof format === 'function') {return format}if (typeof format !== 'string') {throw new Error('format must be string or function')}if (format === 'date') {format = 'yyyy-MM-dd'}if (format === 'dateTime') {format = 'yyyy-MM-dd HH:mm:ss'}const result = dateInfo => {const { year, month, day, hour, minute, second, millisecond } = dateInforeturn format.replaceAll('yyyy', year).replaceAll('MM', month).replaceAll('dd', day).replaceAll('HH', hour).replaceAll('mm', minute).replaceAll('ss', second).replaceAll('ms', millisecond)}return result
}function isDate(value) {return value instanceof Date
}function formatDateTime(date, format, isPad) {date = isDate(date) ? date : new Date(date)if (isNaN(date.getTime())) {throw new Error('Invalid Date')}const f = _format(format)const dateInfo = {year: date.getFullYear().toString(),month: (date.getMonth() + 1).toString(),day: date.getDate().toString(),hour: date.getHours().toString(),minute: date.getMinutes().toString(),second: date.getSeconds().toString(),millisecond: date.getMilliseconds().toString()}function _isPad(prop, len) {dateInfo[prop] = dateInfo[prop].padStart(len, '0')}if (isPad) {_isPad('year', 4)_isPad('month', 2)_isPad('day', 2)_isPad('hour', 2)_isPad('minute', 2)_isPad('second', 2)_isPad('millisecond', 3)}return f(dateInfo)
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/583427.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

PC9095高性能可调限流OVP过压过流保护 软启动 抗浪涌 集成功率FET开关

特点 •输入电压范围: •PC9095A、PC9095KA:2.5伏~13.5伏 •PC9095B,PC9095KB:2.5伏~10伏 •PC9095C,PC9095KC:2.5伏~5.5伏 •28V绝对最大额定电压VOUT •带外部电阻器的可调限流器 •集成功率FET开关,53mΩRds&#xff08…

棒打疯猫^^

欢迎来到程序小院 棒打疯猫 玩法:点击鼠标左键举起棒子打猫,等猫落下之后打,打飞猫遇到炸弹会弹飞更远距离, 遇到大便会停止前进游戏结束,看你能够打飞多远距离,快去打猫吧^^。开始游戏https://www.ormcc.…

阿里云数据库polardb怎么收费?

阿里云数据库PolarDB租用价格表,云数据库PolarDB MySQL版2核4GB(通用)、2个节点、60 GB存储空间55元5天,云数据库 PolarDB 分布式版标准版2核16G(通用)57.6元3天,阿里云百科aliyunbaike.com分享…

文件下载输出zip文件

文件下载输出成zip文件&#xff1a; 1、前端整个按钮&#xff0c;调js方法&#xff1a;&#xff08;参数&#xff1a;param,需要下载的id&#xff0c;用逗号拼接&#xff09; var param "?dto.id";//需要自己拼接param window.location.href "<%basePat…

城市分站优化系统源码:提升百度关键排名 附带完整的搭建教程

城市分站优化已成为企业网络营销的重要手段&#xff0c;今天来给大家分享一款城市分站优化系统源码。 以下是部分代码示例&#xff1a; 系统特色功能一览&#xff1a; 1.多城市分站管理&#xff1a;该系统支持多个城市分站的管理&#xff0c;用户可以根据业务需求&#xff0c;…

官网万词霸屏推广源码系统:轻松实现百度上万关键词排名在线

互联网的快速发展&#xff0c;网络营销已经成为企业推广的重要手段。在这个竞争激烈的市场中&#xff0c;如何让自己的网站在搜索引擎中获得更好的排名&#xff0c;成为众多企业关注的焦点。而万词霸屏推广源码系统正是在这样的背景下应运而生&#xff0c;为企业提供了一种全新…

【深入浅出Java性能调优】「底层技术原理体系」深入探索Java服务器性能监控Metrics框架的实现原理分析(Gauge和Histogram篇)

承接上文 承接上文中的【深度挖掘Java性能调优】「底层技术原理体系」深入探索Java服务器性能监控Metrics框架的实现原理分析&#xff08;Counter篇)&#xff0c;我们知道和了解了对应的Counter计数器的作用和实现原理&#xff0c;接下来我们需要进行分析和了解计量器&#xf…

面试题:MySQL 自增主键一定是连续的吗?

文章目录 测试环境&#xff1a;一、自增值的属性特征&#xff1a;1. 自增主键值是存储在哪的&#xff1f;2. 自增主键值的修改机制&#xff1f; 二、新增语句自增主键是如何变化的&#xff1a;三、自增主键值不连续情况&#xff1a;&#xff08;唯一主键冲突&#xff09;四、自…

uniapp:全局消息是推送,实现app在线更新,WebSocket,apk上传

全局消息是推送&#xff0c;实现app在线更新&#xff0c;WebSocket 1.在main.js中定义全局的WebSocket2.java后端建立和发送WebSocket3.通知所有用户更新 背景&#xff1a; 开发人员开发后app后打包成.apk文件&#xff0c;上传后通知厂区在线用户更新app。 那么没在线的怎么办&…

使用electron属性实现保存图片并获取图片的磁盘路径

在普通的网页开发中&#xff0c;JavaScript由于安全性的考虑&#xff0c;通常是无法直接获取到客户端的磁盘路径的。浏览器出于隐私和安全原因对此类信息进行了限制。 在浏览器环境下&#xff0c;JavaScript主要通过Web APIs来与浏览器进行交互&#xff0c;而这些API通常受到浏…

【北亚服务器数据恢复】ZFS文件系统服务器ZPOOL下线的数据恢复案例

服务器数据恢复环境&#xff1a; 服务器中有32块硬盘&#xff0c;组建了3组RAIDZ&#xff0c;部分磁盘作为热备盘。zfs文件系统。 服务器故障&#xff1a; 服务器运行中突然崩溃&#xff0c;排除断电、进水、异常操作等外部因素。工作人员将服务器重启后发现无法进入操作系统。…

IPD-PDP产品开发流程-PDT产品开发计划Charter文档模板(word)2

书接上回&#xff0c;继续为大家分享PDT的产品开发计划Charter模板的主要内容。 据华研荟了解&#xff0c;大部分国内的企业在推行IPD的时候就直接像华为一样&#xff0c;把开发计划&#xff08;任务书&#xff09;叫做Charter&#xff0c;而不翻译为中文。其实这也是一种很好…

水果软件2024FL Studio21.3mac苹果中文版

FL STUDIO21发布&#xff0c;提供您一直在等待的出色工作流程功能。通过新效果、多个播放列表曲目选择和无所畏惧的撤消一切编辑&#xff0c;将您的音乐带入2024年。FL Studio21中文完整版是一个功能齐全、开放式架构的PC音乐创作和制作环境。它具有基于音乐音序器的图形用户界…

STL——list容器

目录 1.list基本概念 2.list构造函数 3.list赋值和交换 4.list大小操作 5.list插入和删除 6.list数据存取 7.list反转和排序 8.排序案例 1.list基本概念 功能&#xff1a;将数据进行链式存储。 链表&#xff08;list&#xff09;是一种物理存储单元上非连续的存储结构&…

StringBuilder、StringBuffer

StringBuilder StringBuilder代表可变字符串对象&#xff0c;相当于是一个容器&#xff0c;它里面装的字符串是可以改变的&#xff0c;就是用来操作字符串的。好处&#xff1a;StringBuilder比String更适合做字符串的修该操作&#xff0c;效率会更高&#xff0c;代码也会更简洁…

计算机网络概述(上)——“计算机网络”

各位CSDN的uu们好呀&#xff0c;好久没有更新小雅兰的计算机网络的专栏啦&#xff0c;而且期末考试也要考计算机网络&#xff0c;所以&#xff0c;小雅兰就来写计算机网络的内容啦&#xff01;&#xff01;&#xff01;下面&#xff0c;让我们进入计算机网络概述的世界吧&#…

rust中的超时处理

rust中的超时处理 自从 tokio 1.0发布以来&#xff0c;rust的异步开发总算大势已定。尽管没达到标准库的速度&#xff0c;依然挡不住大家的热情。看编程排行榜&#xff0c;增加2倍的开发者。 既生瑜何生亮&#xff0c;感觉go就是小号的rust。 不废话了。背景&#xff1a;之前…

HarmonyOS引导页登陆页以及tabbar的代码说明 登陆页2

代码&#xff1a;这里的prompt.showToast是弹出提示&#xff0c;Extend(TextInput) 的功能是对TextInput做了公用的样式。isShowProgress是用来控制isShowProgress&#xff0c;出来一个等待效果 import prompt from ‘ohos.promptAction’; import router from ‘ohos.router…

Redis缓存雪崩、缓存击穿、缓存穿透

1. 什么是缓存雪崩 当我们提到缓存系统中的问题&#xff0c;缓存雪崩是一个经常被讨论的话题。缓存雪崩是指在某一时刻发生大量的缓存失效&#xff0c;导致瞬间大量的请求直接打到了数据库&#xff0c;可能会导致数据库瞬间压力过大甚至宕机。尤其在高并发的系统中&#xff0c;…

【iptables】增加规则和删除规则

我们在另外一台机器上&#xff0c;使用ping命令&#xff0c;向当前机器发送报文&#xff0c;如下图所示&#xff0c;ping命令可以得到回应&#xff0c;证明ping命令发送的报文已经正常的发送到了防火墙所在的主机&#xff0c;ping命令所在机器IP地址为31.133&#xff08;黑色&a…