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

文章目录

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

不知道大家有没有尝试封装过一个时间格式化的函数啊,在之前我封装的时候,开始是觉得手到擒来,但是实践之后发现写非常的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://xiahunao.cn/news/2661180.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

第二十一章Java网络通信

网络通信这一章 基本分为三个部分 网络基础概念和TCP,UDP这三个部分主要如下: 计算机网络实现了堕胎计算机间的互联,使得它们彼此之间能够进行数据交流。网络应用程序就是再已连接的不同计算机上运行的程序,这些程序借助于网络协议&#x…

Java线上问题排查思路

1、Java 服务常见问题 Java 服务的线上问题从系统表象来看大致可分成两大类: 系统环境异常、业务服务异常。 系统环境异常:主要从CPU、内存、磁盘、网络四个方面考虑。比如:CPU 占用率过高、CPU 上下文切换频率次数较高、系统可用内存长期处于较低值、…

第二证券:普通人怎么选个股?

普通人怎么选个股 1、成果 成果是推动个股上涨的内在动力,即成果好的个股能推动个股持续上涨,成果差的个股会导致个股持续跌落,因而,投资者应该选择成果较好的个股。 2、资金 资金是影响股价涨跌的一重要因素,当资…

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

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

代码随想录-刷题第四十一天

343. 整数拆分 题目链接:343. 整数拆分 思路:动态规划五步曲 dp[i]:拆分数字i,可以得到的最大乘积为dp[i]。 递推公式:dp[i] max(dp[i], max((i - j) * j, dp[i - j] * j)) 从1遍历j,有两种渠道得到dp[…

媲美保时捷:小米汽车正式亮相| 一周 IT资讯

1、对标保时捷、特斯拉!小米汽车首款产品发布 12月28日,万众瞩目之下,小米汽车首场技术发布会终于揭开神秘面纱,来自全国各地的米粉齐聚北京,共同见证了小米汽车的技术特色及优势。 在本次发布会上,小米汽…

数据库进阶教学——读写分离(Mycat1.6+Ubuntu22.04主+Win10从)

目录 1、概述 2、环境准备 3、读写分离实验 3.1、安装jdk 3.2、安装Mycat 3.3、配置Mycat 3.3.1、配置schema.xml ​​​​3.3.2、配置server.xml 3.4、修改主从机远程登陆权限 3.4.1、主机 3.4.2、从机 3.5、启动Mycat 3.6、登录Mycat 3.7、验证 1、概述 读写分…

【HarmonyOS开发】案例-记账本开发

OpenHarmony最近一段时间,简直火的一塌糊度,学习OpenHarmony相关的技术栈也有一段时间了,做个记账本小应用,将所学知识点融合记录一下。 1、记账本涉及知识点 基础组件(Button、Select、Text、Span、Divider、Image&am…

TikTok真题第8天 | 418.屏幕可显示句子的数量、395.至少有K个重复字符的最长子串、1010.总持续时间可以被60整除的歌曲对

418.屏幕可显示句子的数量 题目链接:418.sentence-screen-fitting 解法: 这道题,看题解都很难看懂,哪怕看出点门道了,也很难用自己的话解释出来。 有几点必须清楚: (1)将字符串…

10. Opencv检测并截取图中二维码

1. 说明 在二维码扫描功能开发中,使用相机扫描图片时,往往图片中的信息比较多样,可能会造成二维码检测失败的问题。一种提高检测精度的方式就是把二维码在图片中单独抠出来,去除其它冗余信息,然后再去识别这张提取出来的二维码。本篇博客记录采用的一种实现二维码位置检测…

计算机网络——应用层与网络安全(六)

前言: 前几章我们已经对TCP/IP协议的下四层已经有了一个简单的认识与了解,下面让我们对它的最顶层,应用层进行一个简单的学习与认识,由于计算机网络多样的连接形式、不均匀的终端分布,以及网络的开放性和互联性等特征&…

L1-069:胎压监测

题目描述 小轿车中有一个系统随时监测四个车轮的胎压,如果四轮胎压不是很平衡,则可能对行车造成严重的影响。 让我们把四个车轮 —— 左前轮、右前轮、右后轮、左后轮 —— 顺次编号为 1、2、3、4。本题就请你编写一个监测程序,随时监测四轮的…

GaussDB数据库中的同义词SYNONYM

目录 一、前言 二、GasussDB数据库中的Synonym 1、Synonym的概念 2、语法介绍 3、Synonym的用途 三、Synonym在GaussDB数据库中是如何使用的 1、表的同义词使用(示例) 2、视图的同义词使用(示例) 3、函数的同义词使用&am…

分布式IO在工业自动化中的应用

传统的自动化产线及物流系统主要是利用PLC来处理数据,并将这些数据保存在PC当中。但是随着互联网技术的迅速发展,越来越多的系统集成商利用分布式IO模块,实现从控制器到自动化最底层之间的IO通信。 分布式IO在工业自动化中的应用 分布式IO是用…

Vue3+ElementPlus: 给点击按钮添加触发提示

一、需求 在Vue3项目中,有一个下载按钮,当鼠标悬浮在按钮上面时,会出现文字提示用户可以点击按钮进行数据的下载技术栈 Vue3 ElementPlusTooltip组件 ElementPlus中的Tooltip组件 ,可用于展示鼠标 hover 时的提示信息 二、实现…

【SD】IP-Adapter 进阶 - 垫图 【1】

目录 关于SD1.5的画风迁移 修改动作-方法一:提示词 修改动作-方法二:openpose 关于SD1.5的画风迁移 1.5测试模型:flat2DAnimerge_v30_2.safetensors [b2c93e7a89] 测试图: 文生图:best quality,masterpiece, co…

GPT-5、开源、更强的ChatGPT!

年终岁尾,正值圣诞节热闹气氛的OpenAI写下了2024年的发展清单。 OpenAI联合创始人兼首席执行官Sam Altman在社交平台公布,AGI(稍晚一些)、GPT-5、更好的语音模型、更高的费率限制; 更好的GPTs;更好的推理…

weblogic未授权命令执行漏洞(CVE-2020-14882)

漏洞描述: 未经身份验证的远程攻击者可能通过构造特殊的 HTTP GET请求,利用该漏洞在受影响的 weblogic Server 上执行任意代码。 复现过程: 1.访问ip:port/console 2.poc构造 #!/usr/bin/env python3 # -*- coding: utf-8 -*-…

春款来啦~我先冲了

这款假两件设计的连帽风衣外套 宽松版型对身材包容性很强,韩系慵懒风颜色很舒服 时尚百搭怎么穿都好看系列 做了腰部可调节抽绳,想要修身一点的可以自己调节哈 袖口处也做了金属按扣调节,防风保暖 这件风衣也很好搭配,很经典…

css原子化的框架Tailwindcss的使用教程(原始html和vue项目的安装与配置)

安装教程 中文官网教程 原始的HTML里面使用 新建文件夹npm init -y 初始化项目 安装相关依赖 npm install -D tailwindcss postcss-cli autoprefixer初始化两个文件 npx tailwindcss init -p根目录下新建src/style.css tailwind base; tailwind components; tailwind ut…