181 lines
5.3 KiB
TypeScript
181 lines
5.3 KiB
TypeScript
/**
|
||
* 日期处理工具类(静态工具)
|
||
* 提供日期格式化、日期差计算等功能
|
||
*/
|
||
export class DateEXTEND {
|
||
/**
|
||
* 格式化时间戳为本地时间字符串
|
||
* @param timestamp 时间戳(毫秒)
|
||
* @returns 格式化后的时间字符串(如:2026-04-09 23:59:59)
|
||
*/
|
||
static format(timestamp: number | Date): string {
|
||
if (!timestamp) return ''
|
||
const date = timestamp instanceof Date ? timestamp : new Date(timestamp)
|
||
const year = date.getFullYear()
|
||
const month = String(date.getMonth() + 1).padStart(2, '0')
|
||
const day = String(date.getDate()).padStart(2, '0')
|
||
const hour = String(date.getHours()).padStart(2, '0')
|
||
const minute = String(date.getMinutes()).padStart(2, '0')
|
||
const second = String(date.getSeconds()).padStart(2, '0')
|
||
return `${year}-${month}-${day} ${hour}:${minute}:${second}`
|
||
}
|
||
|
||
/**
|
||
* 格式化日期(仅日期部分)
|
||
* @param timestamp 时间戳(毫秒)
|
||
* @returns 格式化后的日期字符串(如:2026-04-09)
|
||
*/
|
||
static formatDate(timestamp: number | Date): string {
|
||
if (!timestamp) return ''
|
||
const date = timestamp instanceof Date ? timestamp : new Date(timestamp)
|
||
const year = date.getFullYear()
|
||
const month = String(date.getMonth() + 1).padStart(2, '0')
|
||
const day = String(date.getDate()).padStart(2, '0')
|
||
return `${year}-${month}-${day}`
|
||
}
|
||
|
||
/**
|
||
* 格式化时间(仅时间部分)
|
||
* @param timestamp 时间戳(毫秒)
|
||
* @returns 格式化后的时间字符串(如:23:59:59)
|
||
*/
|
||
static formatTime(timestamp: number | Date): string {
|
||
if (!timestamp) return ''
|
||
const date = timestamp instanceof Date ? timestamp : new Date(timestamp)
|
||
const hour = String(date.getHours()).padStart(2, '0')
|
||
const minute = String(date.getMinutes()).padStart(2, '0')
|
||
const second = String(date.getSeconds()).padStart(2, '0')
|
||
return `${hour}:${minute}:${second}`
|
||
}
|
||
|
||
/**
|
||
* 计算两个时间戳的天数差
|
||
* @param start 开始时间戳
|
||
* @param end 结束时间戳
|
||
* @returns 天数差(正数:end在start之后;负数:end在start之前)
|
||
*/
|
||
static diffDay(start: number, end: number): number {
|
||
const oneDay = 1000 * 60 * 60 * 24
|
||
return Math.floor((end - start) / oneDay)
|
||
}
|
||
|
||
/**
|
||
* 计算两个时间戳的小时差
|
||
* @param start 开始时间戳
|
||
* @param end 结束时间戳
|
||
* @returns 小时差
|
||
*/
|
||
static diffHour(start: number, end: number): number {
|
||
const oneHour = 1000 * 60 * 60
|
||
return Math.floor((end - start) / oneHour)
|
||
}
|
||
|
||
/**
|
||
* 计算两个时间戳的分钟差
|
||
* @param start 开始时间戳
|
||
* @param end 结束时间戳
|
||
* @returns 分钟差
|
||
*/
|
||
static diffMinute(start: number, end: number): number {
|
||
const oneMinute = 1000 * 60
|
||
return Math.floor((end - start) / oneMinute)
|
||
}
|
||
|
||
/**
|
||
* 判断是否为今天
|
||
* @param timestamp 时间戳(毫秒)
|
||
* @returns boolean 是今天返回true,否则返回false
|
||
*/
|
||
static isToday(timestamp: number | Date): boolean {
|
||
const today = new Date()
|
||
const target = timestamp instanceof Date ? timestamp : new Date(timestamp)
|
||
return (
|
||
today.getFullYear() === target.getFullYear() &&
|
||
today.getMonth() === target.getMonth() &&
|
||
today.getDate() === target.getDate()
|
||
)
|
||
}
|
||
|
||
/**
|
||
* 判断是否为昨天
|
||
* @param timestamp 时间戳(毫秒)
|
||
* @returns boolean 是昨天返回true,否则返回false
|
||
*/
|
||
static isYesterday(timestamp: number | Date): boolean {
|
||
const yesterday = new Date()
|
||
yesterday.setDate(yesterday.getDate() - 1)
|
||
const target = timestamp instanceof Date ? timestamp : new Date(timestamp)
|
||
return (
|
||
yesterday.getFullYear() === target.getFullYear() &&
|
||
yesterday.getMonth() === target.getMonth() &&
|
||
yesterday.getDate() === target.getDate()
|
||
)
|
||
}
|
||
|
||
/**
|
||
* 智能时间显示(聊天场景使用)
|
||
* @param timestamp 时间戳(毫秒)
|
||
* @returns 智能时间字符串
|
||
*/
|
||
static smartFormat(timestamp: number | Date): string {
|
||
const now = Date.now()
|
||
const target = timestamp instanceof Date ? timestamp.getTime() : timestamp
|
||
const diff = now - target
|
||
|
||
// 小于1分钟
|
||
if (diff < 60 * 1000) {
|
||
return '刚刚'
|
||
}
|
||
|
||
// 小于1小时
|
||
if (diff < 60 * 60 * 1000) {
|
||
return `${Math.floor(diff / (60 * 1000))}分钟前`
|
||
}
|
||
|
||
// 小于24小时
|
||
if (diff < 24 * 60 * 60 * 1000) {
|
||
return `${Math.floor(diff / (60 * 60 * 1000))}小时前`
|
||
}
|
||
|
||
// 今天是显示时间
|
||
if (this.isToday(target)) {
|
||
return this.formatTime(target)
|
||
}
|
||
|
||
// 昨天显示昨天 + 时间
|
||
if (this.isYesterday(target)) {
|
||
return `昨天 ${this.formatTime(target)}`
|
||
}
|
||
|
||
// 其他显示日期时间
|
||
return this.format(target)
|
||
}
|
||
|
||
/**
|
||
* 获取当前时间戳(毫秒)
|
||
* @returns 当前时间戳
|
||
*/
|
||
static now(): number {
|
||
return Date.now()
|
||
}
|
||
|
||
/**
|
||
* 获取今天开始的时间戳
|
||
* @returns 今天开始的时间戳
|
||
*/
|
||
static getTodayStart(): number {
|
||
const today = new Date()
|
||
today.setHours(0, 0, 0, 0)
|
||
return today.getTime()
|
||
}
|
||
|
||
/**
|
||
* 获取今天结束的时间戳
|
||
* @returns 今天结束的时间戳
|
||
*/
|
||
static getTodayEnd(): number {
|
||
const today = new Date()
|
||
today.setHours(23, 59, 59, 999)
|
||
return today.getTime()
|
||
}
|
||
} |