描述
本文描述的是转换日期方法的实现, 这个方法接收两个参数,第一个参数是需要输出日期的格式,第二个参数是需要转换的日期。
代码实现
首先,先实现一种简单转换的方法
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