export class TimeFormatter { static nowDuration = 30 //格式化时间 static formatTimestamp(timestamp: number): string { const currentDate = new Date(); const inputDate = new Date(timestamp); // 判断是否是今天 if ( inputDate.getDate() === currentDate.getDate() && inputDate.getMonth() === currentDate.getMonth() && inputDate.getFullYear() === currentDate.getFullYear() ) { return `今天 ${TimeFormatter.formatTime(inputDate)}`; } // 判断是否是昨天 const yesterday = new Date(); yesterday.setDate(currentDate.getDate() - 1); if ( inputDate.getDate() === yesterday.getDate() && inputDate.getMonth() === yesterday.getMonth() && inputDate.getFullYear() === yesterday.getFullYear() ) { return `昨天 ${TimeFormatter.formatTime(inputDate)}`; } // 判断是否是明天 const tomorrow = new Date(); tomorrow.setDate(currentDate.getDate() + 1); if ( inputDate.getDate() === tomorrow.getDate() && inputDate.getMonth() === tomorrow.getMonth() && inputDate.getFullYear() === tomorrow.getFullYear() ) { return `明天 ${TimeFormatter.formatTime(inputDate)}`; } // 返回 YYYY-MM-DD HH:mm return `${inputDate.getFullYear()}-${TimeFormatter.formatNumber(inputDate.getMonth() + 1)}-${TimeFormatter.formatNumber( inputDate.getDate() )} ${TimeFormatter.formatTime(inputDate)}`; } static dateTimeFormate(timestamp: number) { const currentDate = new Date(); const inputDate = new Date(timestamp); // 判断是否是今天 if ( inputDate.getDate() === currentDate.getDate() && inputDate.getMonth() === currentDate.getMonth() && inputDate.getFullYear() === currentDate.getFullYear() ) { return `今天 ${TimeFormatter.padZero(inputDate.getHours())}:${TimeFormatter.padZero(inputDate.getMinutes())}`; } // 判断是否是昨天 const yesterday = new Date(); yesterday.setDate(currentDate.getDate() - 1); if ( inputDate.getDate() === yesterday.getDate() && inputDate.getMonth() === yesterday.getMonth() && inputDate.getFullYear() === yesterday.getFullYear() ) { return `昨天 ${TimeFormatter.padZero(inputDate.getHours())}:${TimeFormatter.padZero(inputDate.getMinutes())}`; } return TimeFormatter.getDateAndWeek(timestamp)+' '+`${TimeFormatter.padZero(inputDate.getHours())}:${TimeFormatter.padZero(inputDate.getMinutes())}` } //1.只显示时间 static timelineFormatTime(timestamp: number, isTestUser?: boolean): string { if (!timestamp) { return ' ' } var date = new Date(timestamp) // 返回 HH:mm var str = `${TimeFormatter.formatNumber(date.getHours())}:${TimeFormatter.formatNumber(date.getMinutes())}`; if (isTestUser) { str += `:${TimeFormatter.formatNumber(date.getSeconds())}` } return str } //2.基于日期显示日期,省略今天描述 static dateDescription(timestamp: number, showToday?: boolean): string { if (!timestamp) { return '' } const currentDate = new Date(); const inputDate = new Date(timestamp); // 判断是否是今天 if ( inputDate.getDate() === currentDate.getDate() && inputDate.getMonth() === currentDate.getMonth() && inputDate.getFullYear() === currentDate.getFullYear() ) { if (currentDate.getTime() - timestamp <= TimeFormatter.nowDuration * 1000 && currentDate.getTime() - timestamp >= 0) { return '刚刚' } return showToday ? '今天' : ``; } // 判断是否是昨天 const yesterday = new Date(); yesterday.setDate(currentDate.getDate() - 1); if ( inputDate.getDate() === yesterday.getDate() && inputDate.getMonth() === yesterday.getMonth() && inputDate.getFullYear() === yesterday.getFullYear() ) { return `昨天`; } // 判断是否是明天 const tomorrow = new Date(); tomorrow.setDate(currentDate.getDate() + 1); if ( inputDate.getDate() === tomorrow.getDate() && inputDate.getMonth() === tomorrow.getMonth() && inputDate.getFullYear() === tomorrow.getFullYear() ) { return `明天`; } const utcDate1 = Date.UTC(currentDate.getFullYear(), currentDate.getMonth(), currentDate.getDate()) const utcDate2 = Date.UTC(inputDate.getFullYear(), inputDate.getMonth(), inputDate.getDate()) const oneDayMilliseconds = 24 * 60 * 60 * 1000; // 一天的毫秒数 var dayDifference = Math.floor((utcDate2 - utcDate1) / oneDayMilliseconds); if (dayDifference < 0) { // dayDifference = 0 - dayDifference; // return `${dayDifference}天前` var strDt = '' if (currentDate.getFullYear() != inputDate.getFullYear()) { strDt = inputDate.getFullYear() + '年' } strDt = strDt + (inputDate.getMonth() + 1) + '月' strDt = strDt + (inputDate.getDate()) + '日' return strDt } return `${dayDifference}天后` // return `${inputDate.getFullYear()}-${TimeFormatter.formatNumber(inputDate.getMonth() + 1)}-${TimeFormatter.formatNumber( // inputDate.getDate() // )}`; } //3. datedescription+时间,刚刚时隐藏时间 static datetimeDescription(timestamp: number): string { const currentDate = new Date(); if (currentDate.getTime() - timestamp <= TimeFormatter.nowDuration * 1000) { return TimeFormatter.dateDescription(timestamp, true) } return TimeFormatter.dateDescription(timestamp, true) + '' + TimeFormatter.timeDescription(timestamp) } static timeDescription(timestamp): string { const date = new Date(timestamp); return `${TimeFormatter.padZero(date.getHours())}:${TimeFormatter.padZero(date.getMinutes())}`; } static formatTime(date: Date): string { return `${TimeFormatter.formatNumber(date.getHours())}:${TimeFormatter.formatNumber(date.getMinutes())}:${TimeFormatter.formatNumber(date.getSeconds())}`; } static formatNumber(num: number): string { return num.toString().padStart(2, '0'); } static getYearByDate(num: number): string { return (num + '').substring(0, 4) + '年' } static getMonthAndDayByDate(num: number): string { const dt = new Date((num + '').substring(0, 4) + '/' + (num + '').substring(4, 6) + '/' + (num + '').substring(6)); const now = new Date(); const diff = now.getTime() - dt.getTime(); const day = 1000 * 60 * 60 * 24; if (diff < day) { return '今天'; } else if (diff < 2 * day) { return '昨天'; } else { var month = parseInt((num + '').substring(4, 6)) var date = parseInt((num + '').substring(6, 8)) return month + '月' + date + '日' } } //duration 根据起终点时间,忽略精度,如果两个时间点小于60s,则保留精度,否则为分钟 static durationFormate(startTimestamp: number, endTimestamp: number) { var start = startTimestamp; var end = endTimestamp; const diff = Math.abs(end - start); if (diff > 60000) { var startTime = new Date(start) startTime.setSeconds(0) startTime.setMilliseconds(0) var endTime = new Date(end) endTime.setSeconds(0) endTime.setMilliseconds(0) start = startTime.getTime() end = endTime.getTime() } return TimeFormatter.calculateTimeDifference(start, end) } //计算时间间隔 static calculateTimeDifference(startTimestamp: number, endTimestamp: number, ingoreSeconds?: boolean): string { const diff = Math.abs(endTimestamp - startTimestamp); // 计算小时、分钟和秒数 const hours = Math.floor(diff / (1000 * 60 * 60)); const minutes = Math.floor((diff % (1000 * 60 * 60)) / (1000 * 60)); const seconds = Math.floor((diff % (1000 * 60)) / 1000); // 根据间隔的大小返回不同的格式 if (diff < 60000) { return `${seconds}秒`; } else if (diff < 3600000) { return `${minutes}分钟`; // return `${minutes}分${seconds}秒`; } else { // if (ingoreSeconds) return `${hours}小时${minutes}分钟`; // return `${hours}小时${minutes}分${seconds}秒`; if (minutes == 0) { return `${hours}小时`; } return `${hours}小时${minutes}分钟`; } } //格式化时间间隔 static formateTimeDifference(startTimestamp: number, endTimestamp: number, ingoreSeconds?: boolean): string { const diff = Math.abs(endTimestamp - startTimestamp); // 计算小时、分钟和秒数 const hours = Math.floor(diff / (1000 * 60 * 60)); const minutes = Math.floor((diff % (1000 * 60 * 60)) / (1000 * 60)); const seconds = Math.floor((diff % (1000 * 60)) / 1000); // 根据间隔的大小返回不同的格式 if (diff < 60000) { return `00:00:${TimeFormatter.padZero(seconds)}`; } else if (diff < 3600000) { return `00:${TimeFormatter.padZero(minutes)}:${TimeFormatter.padZero(seconds)}`; } else { if (ingoreSeconds) return `${hours}小时${minutes}分`; return `${TimeFormatter.padZero(hours)}:${TimeFormatter.padZero(minutes)}:${TimeFormatter.padZero(seconds)}`; } } static formateTime(timestamp: number) { const date = new Date(timestamp); return `${TimeFormatter.padZero(date.getMonth() + 1)}-${TimeFormatter.padZero(date.getDate())} ${TimeFormatter.padZero(date.getHours())}:${TimeFormatter.padZero(date.getMinutes())}:${TimeFormatter.padZero(date.getSeconds())}`; } static formateHourMinute(startTimestamp: number, endTimestamp: number): string { const diff = Math.abs(endTimestamp - startTimestamp); // 计算小时、分钟和秒数 const hours = Math.floor(diff / (1000 * 60 * 60)); const minutes = Math.floor((diff % (1000 * 60 * 60)) / (1000 * 60)); return (hours < 10 ? `0${hours}` : `${hours}`) + ':' + (minutes < 10 ? `0${minutes}` : `${minutes}`); } static countdown = (dt: number): string => { const end = Date.now(); const time = end > dt ? Math.floor((end - dt) / 1000) : Math.ceil((dt - end) / 1000)//Math.ceil((end>dt?end-dt:dt-end)/1000); const hours = Math.floor(time / 3600); const minutes = Math.floor((time % 3600) / 60); const seconds = Math.floor(time % 60); return `${TimeFormatter.padZero(hours)}:${TimeFormatter.padZero(minutes)}:${TimeFormatter.padZero(seconds)}`; }; //计算正计时 static formateTimeNow = (dt: number): string => { const end = Date.now(); const time = Math.floor((end > dt ? end - dt : dt - end) / 1000); const hours = Math.floor(time / 3600); const minutes = Math.floor((time % 3600) / 60); const seconds = Math.floor(time % 60); return `${TimeFormatter.padZero(hours)}:${TimeFormatter.padZero(minutes)}:${TimeFormatter.padZero(seconds)}`; }; static padZero = (num: number): string => { return num.toString().padStart(2, '0'); }; //根据时间段和一个时间,推算另外一个时间 static calculateTimeByTimeRange = (timeRange: number, strTime: string, isStart: boolean): string => { console.log(timeRange, strTime, isStart) var list = strTime.split(':'); var time = parseInt(list[0]) * 60 + parseInt(list[1]); if (isStart) { time = time + timeRange; } else { time = time - timeRange; } time = time < 0 ? time + 24 * 60 : time; time = time >= 24 * 60 ? time - 24 * 60 : time; var hour = Math.floor(time / 60); var minute = time % 60; return `${TimeFormatter.padZero(hour)}:${TimeFormatter.padZero(minute)}`; } //获取今天的日期和星期几 static getDateAndWeek = (timestamp: number, ignore = false) => { const now = new Date(); var dt = new Date(timestamp) dt.setSeconds(0) dt.setMilliseconds(0) dt.setMinutes(0) dt.setHours(0) const diff = now.getTime() - dt.getTime(); const day = 1000 * 60 * 60 * 24; if (diff < day && !ignore) { return '今天'; } else if (diff < 2 * day && !ignore) { return '昨天'; } else { var weeks = ['日', '一', '二', '三', '四', '五', '六'] return `${dt.getMonth() + 1}月${dt.getDate()}日 星期${weeks[dt.getDay()]}` } } //获取当前时间(hh:mm) static getCurrentHourAndMinute = () => { var now = new Date() return `${TimeFormatter.padZero(now.getHours())}:${TimeFormatter.padZero(now.getMinutes())}`; } }