这里主要是封装了一些对时间/日期进行格式化以及人性化处理的封装的一些公共的函数方法,下面就直接上代码
export default {
/**
* 根据出生日期计算星座
* @param {*} date
* @returns
*
* startMonth:
* 根据出生月份和日期计算星座,具体计算方法为:
* 如果出生日期小于14号,月份减一;
* 如果大于等于14号,则不做修改。
* 上述代码中的“865778999988”是一串数字,
* 表示每个月14号所对应的星座,其中数字的位置对应月份。
* 例如,第一位的数字是8,表示1月14号以前出生的人是属于摩羯座的
*
* getHoroscope("1998-12-24") // 射手座
*/
getHoroscope(date) {
let c = [
"摩羯",
"水瓶",
"双鱼",
"白羊",
"金牛",
"双子",
"巨蟹",
"狮子",
"处女",
"天秤",
"天蝎",
"射手",
"摩羯",
];
// 将传入的日期字符串转化为Date对象
date = new Date(date);
let month = date.getMonth() + 1;
let day = date.getDate();
// 获取出生月份和日期
let startMonth = month - (day - 14 < "865778999988".charAt(month));
return c[startMonth] + "座";
},
/**
* 计算一个日期到当前日期的时间差,并返回相差的天数和小时数
* @param {*} data
* @returns
*
* sumAge("1995-01-01")
*/
sumAge(data) {
let dateBegin = new Date(data.replace(/-/g, "/"));
//获取当前时间
let dateEnd = new Date();
//时间差的毫秒数
let dateDiff = dateEnd.getTime() - dateBegin.getTime();
//计算出相差天数
let dayDiff = Math.floor(dateDiff / (24 * 3600 * 1000));
//计算天数后剩余的毫秒数
let leave1 = dateDiff % (24 * 3600 * 1000);
//计算出小时数
let hours = Math.floor(leave1 / (3600 * 1000));
//计算相差分钟数
let leave2 = leave1 % (3600 * 1000); //计算小时数后剩余的毫秒数
let minutes = Math.floor(leave2 / (60 * 1000)); //计算相差分钟数
//计算相差秒数
let leave3 = leave2 % (60 * 1000); //计算分钟数后剩余的毫秒数
let seconds = Math.round(leave3 / 1000);
return dayDiff + "天 " + hours + "小时 ";
},
/**
* 获取聊天时间(相差300s内的信息不会显示时间)
* 判断两聊天时间之间的间隔是否超过5分钟(300s)
* @param {*} v1
* @param {*} v2
* @returns
getChatTime(1234586754345, 1234586754897)
*/
getChatTime(v1, v2) {
// 判断其长度是否小于13,如果是则将其转换成以毫秒为单位的时间戳
v1 = v1.toString().length < 13 ? v1 * 1000 : v1;
v2 = v2.toString().length < 13 ? v2 * 1000 : v2;
// 计算两个时间戳的差值,将结果转换成秒数。如果相差时间超过5分钟(即300秒)
if ((parseInt(v1) - parseInt(v2)) / 1000 > 300) {
return this.gettime(v1);
}
},
/**
* 人性化时间格式-将时间戳格式化成不同的日期格式
* @param {*} shorttime
* @returns
*
* cha < 43200:当传入时间戳与当前时间相差不到12小时时,
* 返回的日期格式为"{A} {t}:{ii}",其中{A}表示上午或下午,
* {t}表示小时数(12小时制),
* {ii}表示分钟数。
* 例如,如果传入时间戳为1620585600000(2021年5月10日上午10点),
* 则返回"上午 10:00"。
*
*
* cha < 518400:当传入时间戳与当前时间相差超过12小时但不到6天时,
* 返回的日期格式为"{Mon}月{DD}日 {A} {t}:{ii}",
* 其中{Mon}表示月份缩写,{DD}表示日,{A}表示上午或下午,
* {t}表示小时数(12小时制),{ii}表示分钟数。
* 例如,如果传入时间戳为1620000000000(2021年5月3日上午8点),
* 则返回"5月3日 上午 8:00"
*
*
*else:当传入时间戳与当前时间相差超过6天时,
返回的日期格式为"{Y}-{MM}-{DD} {A} {t}:{ii}",
其中{Y}表示年,{MM}表示月,{DD}表示日,{A}表示上午或下午,
{t}表示小时数(12小时制),{ii}表示分钟数。
例如,如果传入时间戳为1609459200000(2021年1月1日上午8点),
则返回"2021-01-01 上午 8:00"
gettime(162058)
*/
gettime(shorttime) {
// 判断传入的shorttime时间戳格式是否为毫秒级的,如果是秒级的则将其转换为毫秒级的
shorttime = shorttime.toString().length < 13 ? shorttime * 1000 : shorttime;
// 获取当前时间的毫秒数
let now = new Date().getTime();
// 获取当前时间与传入时间戳的差值,单位是秒
let cha = (now - parseInt(shorttime)) / 1000;
// 根据差值的大小选择不同的日期格式
if (cha < 43200) {
// 当天
return this.dateFormat(new Date(shorttime), "{A} {t}:{ii}");
} else if (cha < 518400) {
// 隔天 显示日期+时间
return this.dateFormat(new Date(shorttime), "{Mon}月{DD}日 {A} {t}:{ii}");
} else {
// 隔年 显示完整日期+时间
return this.dateFormat(new Date(shorttime), "{Y}-{MM}-{DD} {A} {t}:{ii}");
}
},
/**
* parseNumber(num):将小于 10 的数字转换为两位数的字符串即补零操作
* dateFormat(date, formatStr):将给定的日期对象 date 根据给定的格式字符串 formatStr 转换为字符串表示
*
* {Y}: 四位数的年份,例如 2023。
{M}: 月份,范围是 1-12。
{MM}: 两位数的月份,不足两位时前面补零。
{Mon}: 月份的缩写,例如 1 对应 "1月"。
{D}: 日期,范围是 1-31。
{DD}: 两位数的日期,不足两位时前面补零。
{h}: 小时,范围是 0-23。
{hh}: 两位数的小时,不足两位时前面补零。
{t}: 12 小时制的小时数,范围是 1-12。
{tt}: 两位数的 12 小时制的小时数,不足两位时前面补零。
{A}: 上午或下午。
{i}: 分钟,范围是 0-59。
{ii}: 两位数的分钟,不足两位时前面补零。
{s}: 秒数,范围是 0-59。
{ss}: 两位数的秒数,不足两位时前面补零。
例如,dateFormat(new Date(), "{Y}-{MM}-{DD}") 返回当前日期的 ISO 格式字符串,例如 "2023-05-09"
dateFormat(new Date(), "{Y}-{MM}-{DD} {t}:{ii}:{ss}") 将当前时间转换为形如 "2023-05-09 12:30:45" 的字符串
*/
parseNumber(num) {
return num < 10 ? "0" + num : num;
},
dateFormat(date, formatStr) {
let dateObj = {},
rStr = /\{([^}]+)\}/,
mons = ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12"];
dateObj["Y"] = date.getFullYear();
dateObj["M"] = date.getMonth() + 1;
dateObj["MM"] = this.parseNumber(dateObj["M"]);
dateObj["Mon"] = mons[dateObj["M"] - 1];
dateObj["D"] = date.getDate();
dateObj["DD"] = this.parseNumber(dateObj["D"]);
dateObj["h"] = date.getHours();
dateObj["hh"] = this.parseNumber(dateObj["h"]);
dateObj["t"] = dateObj["h"] > 12 ? dateObj["h"] - 12 : dateObj["h"];
dateObj["tt"] = this.parseNumber(dateObj["t"]);
dateObj["A"] = dateObj["h"] > 12 ? "下午" : "上午";
dateObj["i"] = date.getMinutes();
dateObj["ii"] = this.parseNumber(dateObj["i"]);
dateObj["s"] = date.getSeconds();
dateObj["ss"] = this.parseNumber(dateObj["s"]);
while (rStr.test(formatStr)) {
formatStr = formatStr.replace(rStr, dateObj[RegExp.$1]);
}
return formatStr;
},
/**
* 根据生日计算年龄的功能
* data 表示生日
* @param {*} data
* @returns
*
* birthday:将生日字符串转化为日期类型,并将 - 替换为 /,存储在 birthday 变量中
* return:根据生日和当前日期计算年龄,并返回年龄;具体计算过程如下:
* 计算当前年份减去出生年份,得到年龄。
如果当前月份小于出生月份,年龄减一。
如果当前月份等于出生月份,且当前日期小于出生日期,年龄减一。
返回年龄值
getAgeByBirthday('1999-01-01') // 24
*/
getAgeByBirthday(data) {
let birthday = new Date(data.replace(/-/g, "/"));
let d = new Date();
return (
d.getFullYear() -
birthday.getFullYear() -
(d.getMonth() < birthday.getMonth() ||
(d.getMonth() == birthday.getMonth() && d.getDate() < birthday.getDate())
? 1
: 0)
);
},
};