js 动态设置时间显示,判断时间间隔,时间格式化

一、当天显示小时分钟,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()
*/
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;
},

  • 6
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值