JavaScript — 转换日期

描述

本文描述的是转换日期方法的实现, 这个方法接收两个参数,第一个参数是需要输出日期的格式,第二个参数是需要转换的日期。

代码实现

首先,先实现一种简单转换的方法

function transDate(date) {
	const transTime = (t) => { return t < 10 ? `0${t}` : t };
	const year = date.getFullYear();
	const month = date.getMonth() + 1;
	const day = date.getDate();
	const hours = date.getHours();
	const minutes = transTime(date.getMinutes());
	const seconds = transTime(date.getSeconds());
	return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`;
}

这种方式的转换不够灵活,首先date必须是日期格式,其次若要改变输出的日期格式就必须在方法里面修改。只能够满足一时的需求,但如果想一劳永逸,还是得封装出一个比较通用的方法。

接下来实现刚开始描述的方式,通过传入 格式模板(format) 来输出我所需要的时间格式。
首先写一个map映射,将 时间模板 和 相应的时间 一一对应。

const timeMap = {
	'Y+': year,		// 年
	'M+': month,	// 月
	'D+': day,		// 日
	'h+': hours,	// 时
	'm+': minutes,	// 分
	's+': seconds,	// 秒
};

循环map对象,再通过正则去匹配所传入的字符串,若有则将其替换,然后就能够输出我们想要的时间了。

for (const k in timeMap) {
	const ret = new RegExp(`(${k})`).exec(format);
	if (ret) {
		format = format.replace(ret[0], timeMap[k]);
	}
}

最后附上全部代码

/* 
1、 format 格式必须以 YYYY(年) MM(月) DD(日) hh(时) mm(分) ss(秒) 自由拼接,
	可自定义连接符,例如:YYYY-MM-DD hh:mm:ss
2、 date 可传入两种格式 (Date格式 、 时间戳格式)
*/
function transDate(format, date) {
	/* 将时间戳转换为 Date 格式 */
	const isNumber = /^[0-9]+.?[0-9]*/.test(date);
	if (isNumber) {
		const dateLength = `${date}`.length;
		// 不足13位补足
		const lessThan = date * Math.pow(10, 13 - dateLength);
		// 多于13位去除
		const moreThan = +`${date}`.substring(0, 13);
		const timestamp = dateLength < 13 ? lessThan
			: dateLength > 13 ? moreThan : date;
		date = new Date(timestamp);
	}

	// 剔除非 Date 格式的数据
	const isDateFormat = date instanceof Date;
	if (!isDateFormat) return '-';

	const transTime = (t) => { return t < 10 ? `0${t}` : t };
	const year = date.getFullYear();
	const month = date.getMonth() + 1;
	const day = date.getDate();
	const hours = date.getHours();
	const minutes = transTime(date.getMinutes());
	const seconds = transTime(date.getSeconds());
	const timeMap = {
		'Y+': year,		// 年
		'M+': month,	// 月
		'D+': day,		// 日
		'h+': hours,	// 时
		'm+': minutes,	// 分
		's+': seconds,	// 秒
	};

	for (const k in timeMap) {
		const ret = new RegExp(`(${k})`).exec(format);
		if (ret) {
			format = format.replace(ret[0], timeMap[k]);
		}
	}

	return format;
}
使用效果
transDate('YYYY-MM-DD hh:mm:ss', new Date)
// 2021-7-28 20:54:15
transDate('YYYY-MM-DD hh:mm:ss', 1627476855)
// 2021-7-28 20:54:15
transDate('YYYY/MM/DD hh:mm:ss', 1627476855)
// 2021/7/28 20:54:15
transDate('YYYY-MM-DD', 1627476855)
// 2021-7-28
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值