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

news2024/11/27 0:22:02

文章目录

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

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

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

相关文章

【小程序】如何获取特定页面的小程序码

一、进入到小程序管理后台,进入后点击上方的“工具”》“生成小程序码” 小程序管理后台 二、进入开发者工具,打开对应的小程序项目,复制底部小程序特定页面的路径 三、粘贴到对应位置的文本框,点击确定即可

NCNN环境部署及yolov5pt转ncnn模型转换推理

该内容还未完整,笔记内容,持续补充。 〇开发环境版本 vs2022 cmake3.21.1 ncnn20231027发行版 yolov5s v6.2 vunlkan1.2.198.1 Protobuf3.20.0 Opencv3.4.1 一、模型转换 yolov5s v6.2训练的pt模型,直接导出tourchscript&#xff0c…

鸿蒙APP的代码规范

鸿蒙APP的代码规范是为了确保代码质量、可读性和可维护性而定义的一系列规则和标准。以下是一些建议的鸿蒙APP代码规范,希望对大家有所帮助。北京木奇移动技术有限公司,专业的软件外包开发公司,欢迎交流合作。 1. 代码风格: 采用…

Wish流量推送规则是什么?wish怎么增加流量?-站斧浏览器

Wish流量推送规则是什么? 个性化推送:Wish采用智能化的算法,根据用户的购物历史、浏览记录、搜索行为等数据,为每位用户推送个性化的商品推荐。这种推送方式能够提高商品与用户的匹配度,从而提高转化率。 价格与销量…

视频转换为GIF格式的3种方法

如果你想与朋友分享一个有趣的瞬间或者在社交媒体上发布一些搞笑的短视频,那么GIF格式将会是一个绝佳的选择。因为相比于视频,GIF文件具有更小的文件大小和更好的兼容性。不过,并不是所有人都知道如何将视频转换为GIF格式。不用担心&#xff…

65.乐理基础-打拍子-前附点、后附点

内容来源于:三分钟音乐社 上一个内容:前八后十六、前十六后八拍子-CSDN博客 前附点指的是一个附点八分音符加一个十六分音符的节奏型,如图1。 后附点指的是一个十六分音符加一个附点八分音符的节奏型,如图2。 前附点、后附点这两…

第三节-数据链路层与MAC地址

如果数据进行封装时,基于E2或者802.3标准,此时我们称之为是一个以太网数据帧。 不同的协议栈用于定义和管理不同网络的数据转发规则。 E2和802.3作用:定义帧头和帧尾的格式 数据:对于下层的每个层级而言,上层所反馈…

鸿蒙开发(二)- 鸿蒙DevEco3.X开发环境搭建

上篇说到,鸿蒙开发目前势头旺盛,头部大厂正在如火如荼地进行着,华为也对外宣称已经跟多个厂商达成合作。目前看来,对于前端或客户端开发人员来说,掌握下鸿蒙开发还是有些必要性的。如果你之前是从事Android开发的&…

C语言字符串知识点和算法总结

目录 一、字符串遍历 1、字符串和字符数组 2、获取字符串长度 3、字符串遍历 4、大小写转换 5、字符串数组 二、字符串拷贝 三、字符串比较 四、字符串分割 五、字符串翻转 1、题目详解 2、算法详解 3、源码剖析 六、回文串 1、定义 2、例题讲解 3、算法详解 …

子网掩码与IP段计算

一.什么叫子网掩码: 子网掩码(subnet mask)又叫网络掩码、地址掩码、子网络遮罩,它用来指明一个IP地址的哪些位标识的是主机所在的子网,以及哪些位标识的是主机的位掩码。子网掩码不能单独存在,它必须结合IP地址一起使用。 子网掩…

【开源】基于Vue+SpringBoot的班级考勤管理系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 系统基础支持模块2.2 班级学生教师支持模块2.3 考勤签到管理2.4 学生请假管理 三、系统设计3.1 功能设计3.1.1 系统基础支持模块3.1.2 班级学生教师档案模块3.1.3 考勤签到管理模块3.1.4 学生请假管理模块 3.2 数据库设…

深入理解 C# 中的字符串比较:String.CompareTo vs String.Equals

深入理解 C# 中的字符串比较:String.CompareTo vs String.Equals 在处理字符串时,了解如何正确比较它们对于编写清晰、有效和可靠的 C# 程序至关重要。本文将深入探讨 C# 中的两个常用字符串比较方法:String.CompareTo 和 String.Equals&…

沃通中小微企业SSL优惠专场,DV SSL证书降幅35%

沃通CA助力中小微企业数字化安全发展,推出“中小微企业SSL优惠专场”,深受中小微企业青睐的超快SSL系列证书特惠来袭,降幅达35%!实现HTTPS加密、维护企业数据传输安全,满足法律法规对数据安全保护的基本要求&#xff0…

QT应用篇 二、QML用Image组件实现Progress Bar 的效果

QT应用篇 一、QT上位机串口编程 二、QML用Image组件实现Progress Bar 的效果 三、QML自定义显示SpinBox的加减按键图片及显示值效果 文章目录 QT应用篇前言一、qml需求二、使用组件1.Image组件2.Image中fillMode的使用例子 总结 前言 记录自己学习QML的一些小技巧方便日后查找…

UniApp小程序使用vant引入vant weapp

HBuilder X里新建项目指路 HBuilderX新建项目 安装node.js指路 安装node.js 1.通过npm安装 查看npm环境 //打开终端输入命令查看版本 npm -version 1.1.右键打开外部终端窗口 1.2.输入npm init -y命令 1.3.通过命令安装 npm i vant/weapp1.3.3 -S --production 1.4.打开工具…

存算分离降本增效,StarRocks 助力聚水潭 SaaS 业务服务化升级

作者:聚水潭数据研发负责人 溪竹 聚水潭是中国领先的 SaaS 软件服务商,核心产品是电商 ERP,协同350余家电商平台,为商家提供综合的信息化、数字化解决方案。公司是偏线下商家侧的 toB 服务商,员工人数超过3500&#xf…

亚马逊SEO是什么意思?亚马逊标题的SEO方法是什么?-站斧浏览器

亚马逊SEO是什么意思? 亚马逊SEO主要包括了对标题、描述、五点简介等元素的优化,以及评价和评论的管理等方面。下面将详细分析亚马逊SEO的相关内容,帮助卖家更好地理解和应用。 在亚马逊平台上进行SEO优化需要考虑以下几个方面:…

深算院与新数科技达成战略合作,共筑国产数据库新生态

近日,深圳计算科学研究院(以下简称“深算院”)与北京新数科技有限公司(以下简称“新数科技”)达成战略合作。双方将融合发挥资源优势与技术优势,基于深算院自主研发设计的崖山数据库系统YashanDB&#xff0…

MetaGPT( The Multi-Agent Framework):颠覆AI开发的革命性多智能体元编程框架

一个多智能体元编程框架,给定一行需求,它可以返回产品文档、架构设计、任务列表和代码。这个项目提供了一种创新的方式来管理和执行项目,将需求转化为具体的文档和任务列表,使项目管理变得高效而智能。对于需要进行规划和协调的项…

ssm基于JavaEE的智能实时疫情监管服务平台的设计与实现+jsp论文

摘 要 社会发展日新月异,用计算机应用实现数据管理功能已经算是很完善的了,但是随着移动互联网的到来,处理信息不再受制于地理位置的限制,处理信息及时高效,备受人们的喜爱。本次开发一套智能实时疫情监管服务平台有管…