一、当天显示小时分钟,1-3天显示星期,超过3天显示月日,一般用于聊天消息列表居多
function formatMsgTime(time) {
//time传入的是时间戳,且时间戳长度为10位
const todayZero = new Date().setHours(0, 0, 0, 0);
const yearZero = new Date(new Date().getFullYear(), 0, 1, 0, 0, 0, 0).getTime();
const target = new Date(time * 1000);
const oneDay = 24 * 60 * 60 * 1000;
const oneWeek = 7 * oneDay;
const diff = todayZero - target.getTime();
const weekdays = ["星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六"];
const weekday = weekdays[target.getDay()];
function formatNum(num) {
return num < 10 ? '0' + num : num.toString();
}
if (diff <= 0) { // 当天,
return `${formatNum(target.getHours())}:${formatNum(target.getMinutes())}`;
} else if (diff <= oneWeek - oneDay * 4) { // 三天内,根据需求修改需要几天内显示的是星期
return `${weekday} ${formatNum(target.getHours())}:${formatNum(target.getMinutes())}`;
} else if (diff > oneWeek - oneDay * 4 && target.getTime() >= yearZero) { // 超过三天且在当年
return `${target.getMonth() + 1}/${target.getDate()} ${formatNum(target.getHours())}:${formatNum(target.getMinutes())}`;
} else { //不在当年
return `${target.getFullYear()}/${target.getMonth() + 1}/${target.getDate()} ${formatNum(target.getHours())}:${formatNum(target.getMinutes())}`;
}
}
二、判断两个时间的时间间隔,时分秒或相差的天数 多种方式
/*
* date1 开始时间, date2 结束时间, pattern 显示格式(这里只需要显示经时时分秒格式)
*/
countRunTime(date1, date2, pattern) {
let startTime = new Date(date1)
let endTime = new Date(date2)
var dataDiff = endTime.getTime() - startTime.getTime()
//天数
var dayDiff = Math.floor(dataDiff / (24 * 3600 * 1000))
//小时
var leave1 = dataDiff % (24 * 3600 * 1000)
var hours = Math.floor(leave1 / (3600 * 1000))
//分钟
var leave2 = leave1 % (3600 * 1000)
var minutes = Math.floor(leave2 / (60 * 1000))
//秒数
var leave3 = leave2 % (60 * 1000)
var seconds = Math.round(leave3 / 1000)
if (pattern.indexOf(":") != -1) {
return hours + ":" + minutes
} else {
return hours + '小时' + minutes + '分'
}
}
//页面调用:<view>{{ countRunTime(fromTime,toTime,'hh时mm分')" }}</view>
countRunTime2(timestamp1, timestamp2) {
// 确保timestamp1小于timestamp2
if (timestamp1 > timestamp2) {
[timestamp1, timestamp2] = [timestamp2, timestamp1];
}
// 计算时间差(以毫秒为单位)
const diff = timestamp2 - timestamp1;
// 转换为更易理解的单位
const days = Math.floor(diff / (1000 * 60 * 60 * 24)); // 天数
const hours = Math.floor((diff % (1000 * 60 * 60 * 24)) / (1000 * 60 * 60)); // 小时数
const minutes = Math.floor((diff % (1000 * 60 * 60)) / (1000 * 60)); // 分钟数
const seconds = Math.floor((diff % (1000 * 60)) / 1000); // 秒数
return { days, hours, minutes, seconds };
}
// 示例:计算当前时间到2023-12-31 23:59:59的时间差
const endTime = new Date('2023-12-31T23:59:59').getTime();
const nowTime= new Date().getTime();
const remaining = countRunTime2(nowTime, endTime );
console.log(`剩余 ${remaining.days} 天 ${remaining.hours} 小时 ${remaining.minutes} 分 ${remaining.seconds} 秒`);
计算天数
countDays(date1, date2) {
//date1 开始时间, date2 结束时间, 将日期字符串转换为时间戳(单位:毫秒 )
var timestamp1 = new Date(date1).getTime();
var timestamp2 = new Date(date2).getTime();
// 计算两个时间戳之间的毫秒数差值
var diffInMillisecs = Math.abs(timestamp2 - timestamp1);
// 将毫秒数差值转换为天数
var daysDiff = Math.ceil(diffInMillisecs / (1000 * 60 * 60 * 24));
return daysDiff
}
两个时间相差多久,相差年,月,日,小时,分钟
function getDistanceDay(time) {
let stime = new Date().getTime(); // 2024-05-17 14:36
let usedTime = stime - time; //两个时间戳相差的毫秒数
let one_minute = 60 * 1000;
let one_hour = 60 * 60 * 1000;
let one_day = 24 * 60 * 60 * 1000;
let timeTxt = '';
if (usedTime >= one_day) {
//相差几天
let disparityDay = parseInt(usedTime / one_day);
timeTxt = disparityDay + '天前';
if (disparityDay > getMonthDay()){
timeTxt = getDisparityMonth(disparityDay) + '个月前';
}
if (disparityDay > getYearDay()){
timeTxt = parseInt(disparityDay / getYearDay()) + '年前';
} else {
if (usedTime >= one_hour) {
timeTxt = parseInt(usedTime / one_hour) + '小时前';
} else if (usedTime >= one_minute) {
timeTxt = parseInt(usedTime / one_minute) + '分钟前';
} else {
timeTxt = '刚刚';
}
}
return timeTxt;
}
// 获取相差几个月 传天数
function getDisparityMonth(disparityDay) {
let disparityMonth = 0;
let countFc = () => {
if (disparityDay > getMonthDay(disparityMonth)) {
disparityDay -= getMonthDay(disparityMonth)
disparityMonth += 1;
countFc(disparityMonth)
} else {
return disparityMonth;
}
}
countFc(disparityMonth)
return disparityMonth;
}
// 获取相差几个月 传开始时间和结束时间
function gerDisMonth(date1,date2){
var m1 = parseInt(date1.split("-")[1].replace(/^0+/, "")) + parseInt(date1.split("-")[0]) * 12;
var m2 = parseInt(date2.split("-")[1].replace(/^0+/, "")) + parseInt(date2.split("-")[0]) * 12;
return(m2 - m1);
}
// 获取当前月有多少天 可以计算前面几个月有多少天 upNum 是前面几个月
function getMonthDay(upNum) {
let day = 0;
let month = new Date().getMonth() + 1;// 获取当前月
if (upNum) {
let date = new Date();
date.setMonth(date.getMonth() - upNum);
month = date.getMonth() + 1;
}
if (month == 1 || month == 3 || month == 5 || month == 7 || month == 8 || month == 10 || month == 12) {
day = 31
} else if (month == 2) {
if (getYearDay() == 366) day = 29
if (getYearDay() == 365) day = 28
} else {
day = 30
}
return day;
}
// 获取当前年有多少天
function getYearDay() {
let day = 365
let year = new Date().getFullYear();
if (year % 4 == 0) day = 366;
return day
}
}
let time = new Date('2024-05-15 14:00').getTime()
let timeTxt = getDistanceDay(time)
console.log('timeTxt', timeTxt) //timeTxt 48小时前
算出一年有多少天
getYearsDays(e) {
if (e != null && e != "" && e != undefined) {
var year = Number(e);
var isLeap = (year % 4 == 0) && (year % 100 != 0) || (year % 400 == 0),
days = isLeap ? 366 : 365;
console.log(days);
}
},
计算时间差的方法
monthDayDiff(startTime,endTime) {
let flag = [1, 3, 5, 7, 8, 10, 12, 4, 6, 9, 11, 2];
let start = new Date(startTime);
let end = new Date(endTime);
let year = end.getFullYear() - start.getFullYear();
let month = end.getMonth() - start.getMonth();
let day = end.getDate() - start.getDate();
if (month < 0) {
year--;
month = end.getMonth() + (12 - start.getMonth());
}
if (day < 0) {
month--;
let index = flag.findIndex((temp) => {
return temp === start.getMonth() + 1
});
let monthLength;
if (index <= 6) {
monthLength = 31;
} else if (index > 6 && index <= 10) {
monthLength = 30;
} else {
monthLength = 28;
}
day = end.getDate() + (monthLength - start.getDate());
}
this.result = `相差${year}年${month}月${day}天`;
console.log(this.result)
},
获取月初和月末
getCurrentMonthFirst() {
var date = new Date()
date.setDate(1)
var month = parseInt(date.getMonth() + 1)
var day = date.getDate()
if (month < 10) month = '0' + month
if (day < 10) day = '0' + day
this.startTime = date.getFullYear() + '-' + month + '-' + day
},
getCurrentMonthLast() {
var date = new Date()
var month = parseInt(date.getMonth() + 1)
var day = lastTime.getDate()
if (month < 10) month = '0' + month
if (day < 10) day = '0' + day
this.endTime = date.getFullYear() + '-' + month + '-' + day
},
计算指定日期的n天/n月/n年后的日期
/*
interval: 单位 年/季/月/星期/天
num: 数量
date: 指定日期 如: 当前时间new Date()
可单独使用每个条件中的set...(),但输出格式:Mon Jun 09 20xx 11:17:58 GMT+0800 (中国标准时间),需要按需转换格式,如用moment.js,moment(date).format('YYYY-MM-DD')
*/
const dateAdd = (interval, num, date) => {
const number = Number(num);
switch (interval) {
case "y": {
date.setFullYear(date.getFullYear() + number);
return date;
break;
}
case "q": {
date.setMonth(date.getMonth() + number * 3);
return date;
break;
}
case "m": {
date.setMonth(date.getMonth() + number);
return date;
break;
}
case "w": {
date.setDate(date.getDate() + number * 7);
return date;
break;
}
case "d": {
date.setDate(date.getDate() + number);
return date;
break;
}
default: {
date.setDate(date.getDate() + number);
return date;
break;
}
}
}
根据开始日期和期限来计算结束日期
var day = 3; //获取相隔天数
var newTime = Date.parse('2024-05-17') //将日期时间转换为毫秒值
var newTimes = newTime + 3600000 * 24 * (day); // 3600000 为1小时的毫秒值
var newDate = new Date(newTimes); //将获取的毫秒值转换为对应的日期时间
console.log(newDate);
//需要处理时间格式,结果为 Mon May 20 2024 08:00:00 GMT+0800 (中国标准时间)
计算周期后的结束时间
获取当前时间,day为number,getDay(-1):昨天的日期;getDay(0):今天的日期;getDay(1):明天的日期;【以此类推】
getDay(day) {
var today = new Date('2020-01-01');
var targetday_milliseconds = today.getTime() + 1000 * 60 * 60 * 24 * day;
today.setTime(targetday_milliseconds); //注意,这行是关键代码
var tYear = today.getFullYear();
var tMonth = today.getMonth();
var tDate = today.getDate();
tMonth = this.doHandleMonth(tMonth + 1);
tDate = this.doHandleMonth(tDate);
return tYear + "-" + tMonth + "-" + tDate;
},
doHandleMonth(month) {
var m = month;
if (month.toString().length == 1) {
m = "0" + month;
}
return m;
},
三、日期格式化
parseTime(time, pattern) {
if (arguments.length === 0 || !time) {
return null
}
const format = pattern || '{y}-{m}-{d} {h}:{i}:{s}'
let date
if (typeof time === 'object') {
date = time
} else {
if ((typeof time === 'string') && (/^[0-9]+$/.test(time))) {
time = parseInt(time)
} else if (typeof time === 'string') {
time = time.replace(new RegExp(/-/gm), '/');
}
if ((typeof time === 'number') && (time.toString().length === 10)) {
time = time * 1000
}
date = new Date(time)
}
const formatObj = {
y: date.getFullYear(),
m: date.getMonth() + 1,
d: date.getDate(),
h: date.getHours(),
i: date.getMinutes(),
s: date.getSeconds(),
a: date.getDay()
}
const time_str = format.replace(/{(y|m|d|h|i|s|a)+}/g, (result, key) => {
let value = formatObj[key]
if (key === 'a') {
return ['日', '一', '二', '三', '四', '五', '六'][value]
}
if (result.length > 0 && value < 10) {
value = '0' + value
}
return value || 0
})
return time_str
}
当前日期转为字符串
dateToString(now) {
var year = now.getFullYear();
var month = (now.getMonth() + 1).toString();
var day = now.getDate().toString();
if (month.length == 1) {
month = "0" + month;
}
if (day.length == 1) {
day = "0" + day;
}
var dateTime = year + "-" + month + "-" + day;
return dateTime;
},