菜单 搜索
首页 前端知识 JS获取时间,封装函数将时间减一天、一月、一年,并加以格式化,前端显示不同状态时间封装

JS获取时间,封装函数将时间减一天、一月、一年,并加以格式化,前端显示不同状态时间封装

2024-05-10 08:05:39 前端知识 前端哥 36 279 我要收藏

JS获取时间,封装函数将时间减一天、一月、一年,并加以格式化,前端显示不同状态时间封装

写一个时间的utils文件,可以给公司或者个人使用的小工具。

一、获取时间的某个参数封装

1. 代码

在js中,为什么要封装一个这样看起来没什么作用的函数呢,主要是为了服务与其他函数调用,假如说写一个和包含时间的js库,那么这个东西,就会减少代码量,复用这个代码。

// 获取当前时间的 ms s min h day month year
function getSeverTime(time = new Date()) {
	const Time = new Date(time)
	return {
		ms: Time.getMilliseconds(),
		s: Time.getSeconds(),
		min: Time.getMinutes(),
		h: Time.getHours(),
		date: Time.getDate(),
		day: Time.getDay(),
		month: Time.getMonth(),
		year: Time.getFullYear(),
	}
}

二、封装时间减一天,或者不同时间后的时间。

其实说js有对每一个时间有一个set的方法,去修改对应的时间,而我们封装一个方法可以重复重复一个函数去算一个复杂的时间,而对这个代码稍做处理就可以将这一部分变为链式调用的代码

1、代码

/**
 *
 * @param {time,num,type} ops
 * @param time  可选,不传默认当前时间,传入可转换时间参数
 * @param num   可选 ,默认0,传入减去的时间,1....
 * @param type   可选,默认ms,减去时间的单位标准
 * @returns Date()
 */
function subtractTime(ops = []) {
	const [time = new Date(), num = 0, type = 'ms'] = ops
	const Time = new Date(time)
	const { ms, s, min, h, date, month, year } = getSeverTime(time)
	// ms s min h day week month quarter year
	switch (type) {
		case 'ms':
			Time.setMilliseconds(ms - num)
			break
		case 's':
			Time.setSeconds(s - num)
			break
		case 'min':
			Time.setMinutes(min - num)
			break
		case 'h':
			Time.setHours(h - num)
			break
		case 'day':
			Time.setDate(date - num)
			break
		case 'week':
			Time.setDate(date - num * 7)
			break
		case 'month':
			Time.setMonth(month - num)
			break
		case 'quarter':
			Time.setMonth(month - num * 3)
			break
		case 'year':
			Time.setFullYear(year - num)
			break
		default:
			throw 'error: type is mistake'
	}
	return Time
}

根据js中this指向取决谁调用,通过这一个操作可以完成链式,将参数变为两个,并将方法挂载到date 实例上,同时时间通过this去获取,如果你想可以自己去尝试一下,我这里需求稍微不一样,所以没做这个处理。

2、效果

使用

subtractTime([, 1, 'day'])

结果

输出时间为今天减1 day,
在这里插入图片描述

三、格式化时间

在js中内置对象 Date中是没有一个好的格式化,很难满足需求,不过这个方法其实也不难实现,然而为了这个格式化能够应付各种场景,所以如此实现。

1、代码

/**
 * @param {*} time
 * Y年(xxxx) M月(xx) D日(xx)  k K 数字或中文  w W 英文缩写 或全写  h 时 m分 s秒 ms毫秒
 * @param {*} formatStr
 * `Y-M-D w h:m:s`
 * @return `Y/M/D w h:m:s`
 */
function formatTime(time, formatStr = 'YYYY/MM/DD ww hh:mm:ss') {
	const weekStr = [
		'星期日',
		'星期一',
		'星期二',
		'星期三',
		'星期四',
		'星期五',
		'星期六',
	]
	const weekLet = ['Sun.', 'Mon.', 'Tues.', 'Wed.', 'Thurs.', 'Fri.', 'Sat']
	const WeekLet = [
		'Sunday',
		'Monday',
		'Tuesday',
		'Wednesday',
		'Thursday',
		'Friday',
		'Saturday',
	]
	const { ms, s, min, h, day, date, month, year } = getSeverTime(time)
	// Y年(xxxx) M月(xx) D日(xx)  k K 数字或中文  w W 英文缩写 或全写  h 时 m分 s秒 ms毫秒
	return formatStr
		.replace('YYYY', year)
		.replace('MM', month + 1)
		.replace('DD', date)
		.replace('kk', day)
		.replace('hh', h)
		.replace('mm', min)
		.replace('ss', s)
		.replace('ms', ms)
		.replace('KK', weekStr[day])
		.replace('ww', weekLet[day])
		.replace('WW', WeekLet[day])

	// const timeStr
}

2 、效果

使用

formatTime(subtractTime([, 1, 'day']))
formatTime(subtractTime([, 1, 'day']))

结果

在这里插入图片描述

三、规则匹配时间

假如你们有和我一样个需求,这个非常适合,假如说现在有一组数据,后端返回时间戳,而我们前端要根据这个时间与现在时间差距,判断他是昨天,还是前天,啥的,就可以用这个方法。

代码

/**
 * 显示时间的rules
 * @param {rule,case} rules  匹配规则
 * @param {*} time  需要判断的时间
 * @param {*} StaTime 基准时间,默认当前时间
 * @returns
 */
function showTime(rules, time, StaTime = new Date()) {
	time = new Date(time)
	console.log(time)
	StaTime = new Date(StaTime)
	if (!(rules && time)) {
		throw 'rules & time can not be empty'
	}
	if (!Array.isArray(rules)) {
		throw 'rules is not Array'
	}
	if (rules.length === 0) {
		return formatTime(time)
	}
	for (let item of rules) {
		if (
			item instanceof Function &&
			item(time.getTime(), StaTime.getTime())
		) {
			return item(time.getTime(), StaTime.getTime())
		}
		if (typeof item.rule === 'boolean') {
			if (item.rule) return formatTime(time, item.case)
		} else {
			const staUpdateStr = subtractTime([
				StaTime,
				item.rule,
				item.type,
			]).getTime()
			const staStr = subtractTime([StaTime, , item.type]).getTime()
			const timeStr = subtractTime([time, , item.type]).getTime()
			switch (true) {
				case item.rule >= 0 &&
					staStr > timeStr &&
					staUpdateStr <= timeStr:
					return formatTime(time, item.case)
				case item.rule <= 0 &&
					staStr < timeStr &&
					staUpdateStr >= timeStr:
					return formatTime(time, item.case)
			}
		}
	}

	return formatTime(time)
}

2、效果

使用

匹配规则可以传入如下所有方式

showTime(
		[
			{ rule: 1, type: 'day', case: '昨天 DD-hh-mm' },
			{ rule: -10, type: 'day', case: '明天 DD-hh-mm' },
			(time, StaTime) => {
				if (time > StaTime) {
					return time
				}
			},
			{ rule: 1 > 2, case: 'hh:mm' },
		],
		'2022/11/14'
	)
结果

输出就是,通过输入时间与基准时间经过匹配后的结果,case则是写时间格式,根据上一个方法。

最后

将所有的方法写到内置函数Date的原型上,并封装一个对象export。
通过两种方法使用,这里简单的赋值一下,如果说要做一个方法很多的时间库,那么可能还要在底层进行修改,让函数方法自动可以添加到实例和对象中,这个底层代码可以参考underscore的底层源码。
在这里插入图片描述

结尾

简单封装几个时间函数,完成了公司所需要的需求,并保留一个方法做为以后时间函数的基础,如果条件允许可以,开发并递进到前端基建的utils中。

转载请注明出处或者链接地址: https://www.qianduange.cn//article/7862.html
标签
上一篇:HTML基本结构及基本标签
评论
相关文章
  • 图片切换之HTML
  • 携程网移动端首页制作(html5 css3)
  • 拖放拖拽事件
  • html5&css&js代码 002 50以内的加法算式
  • 基于HTML5的仿得物H5端的开发(源码 开题)
  • 【博主推荐】HTML5实现520表白、情人节表白模板源码
  • 用html和css纯代码制作会旋转的太极图(详细讲解)点赞加关注,经典案例持续更新~
  • 【HTML CSS JS 蝴蝶飞舞特效 绝美(附完整代码)】
  • dotnet 将C#编译为wasm让前端html使用
  • html制作好看的个人简历(附源码)

前端哥

前端哥

发布的文章

图片切换之HTML

2024-05-18 18:05:47

携程网移动端首页制作(html5 css3)

2024-05-18 18:05:34

拖放拖拽事件

2024-05-18 18:05:33

html5&css&js代码 002 50以内的加法算式

2024-05-18 18:05:33

HTML5实现文件批量上传组件

2024-05-18 18:05:22

基于HTML5的仿得物H5端的开发(源码 开题)

2024-05-18 18:05:12

【博主推荐】HTML5实现520表白、情人节表白模板源码

2024-05-18 18:05:28

用html和css纯代码制作会旋转的太极图(详细讲解)点赞加关注,经典案例持续更新~

2024-05-18 18:05:23

python生成图表模块名称叫,python生成图表嵌入html

2024-05-18 18:05:08

Head First HTML与CSS笔记----有关字体

2024-05-18 18:05:03

大家推荐的文章
1

轻松掌握数据库中JSON数据提取:json_extract函数用法详解

2024-05-09 11:05:011000

2

HTML5(六)——Canvas 高级操作

2024-05-09 10:05:191000

3

UE4.27支持HTML5

2024-05-07 13:05:261000

4

前端vue项目使用Decimal.js做加减乘除求余运算

2024-04-23 21:04:401000

5

js数组常用方法(19种)|你会的到底有多少呢?

2024-04-08 11:04:211000

6

jQuery事件处理

2024-03-12 01:03:321000

7

【Echarts系列】—— 实现电池图、3D立体圆形柱状图

2024-03-03 11:03:011000

8

ECharts 饼状图颜色设置

2024-02-16 14:02:001000

9

echarts实现动态渲染多柱图

2024-02-12 14:02:341000

10

移动端css布局大全

2024-02-06 15:02:421000

会员中心 联系我 留言建议 回顶部
复制成功!

天下网标王铜仁网站优化公司排名北京seo网站优化价格网站做优化只信d火20星荐天津网站关键词优化热线电话张掖网站优化推广萧山优化网站哪家好网站优化软件云速捷霸屏网站优化重要性免费seo网址网站优化绍兴seo优化网站费用如何优化网站找金手指20江苏网站首页优化公司报价济南企业网站优化推广渠道高邑县网站优化婚纱摄影网站优化运营SEO优化专员网站优化招聘南阳网站优化招商东莞企业网站优化费用多少福田论坛网站优化哪家好长春传统行业网站优化方案石家庄网站seo优化南宁网站的优化江苏网站优化排名有哪些记账公司网站建设制作优化推广深圳市网站优化报价有哪些方式优化网站的性能网站标题优化在线喜茶网站的url优化网站提速是否是过度优化优化网站套餐香港通过《维护国家安全条例》两大学生合买彩票中奖一人不认账让美丽中国“从细节出发”19岁小伙救下5人后溺亡 多方发声卫健委通报少年有偿捐血浆16次猝死汪小菲曝离婚始末何赛飞追着代拍打雅江山火三名扑火人员牺牲系谣言男子被猫抓伤后确诊“猫抓病”周杰伦一审败诉网易中国拥有亿元资产的家庭达13.3万户315晚会后胖东来又人满为患了高校汽车撞人致3死16伤 司机系学生张家界的山上“长”满了韩国人?张立群任西安交通大学校长手机成瘾是影响睡眠质量重要因素网友洛杉矶偶遇贾玲“重生之我在北大当嫡校长”单亲妈妈陷入热恋 14岁儿子报警倪萍分享减重40斤方法杨倩无缘巴黎奥运考生莫言也上北大硕士复试名单了许家印被限制高消费奥巴马现身唐宁街 黑色着装引猜测专访95后高颜值猪保姆男孩8年未见母亲被告知被遗忘七年后宇文玥被薅头发捞上岸郑州一火锅店爆改成麻辣烫店西双版纳热带植物园回应蜉蝣大爆发沉迷短剧的人就像掉进了杀猪盘当地回应沈阳致3死车祸车主疑毒驾开除党籍5年后 原水城县长再被查凯特王妃现身!外出购物视频曝光初中生遭15人围殴自卫刺伤3人判无罪事业单位女子向同事水杯投不明物质男子被流浪猫绊倒 投喂者赔24万外国人感慨凌晨的中国很安全路边卖淀粉肠阿姨主动出示声明书胖东来员工每周单休无小长假王树国卸任西安交大校长 师生送别小米汽车超级工厂正式揭幕黑马情侣提车了妈妈回应孩子在校撞护栏坠楼校方回应护栏损坏小学生课间坠楼房客欠租失踪 房东直发愁专家建议不必谈骨泥色变老人退休金被冒领16年 金额超20万西藏招商引资投资者子女可当地高考特朗普无法缴纳4.54亿美元罚金浙江一高校内汽车冲撞行人 多人受伤

天下网标王 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化