104 lines
4.4 KiB
JavaScript
104 lines
4.4 KiB
JavaScript
/**
|
||
* 时间差判断工具类
|
||
* 核心功能:判断目标时间与当前时间的差值是否小于指定秒数
|
||
* 支持的目标时间格式:毫秒级时间戳、秒级时间戳、Date对象、合法时间字符串(如 "2026-02-12 10:00:00")
|
||
*/
|
||
class TimeUtil {
|
||
/**
|
||
* 判断目标时间距离当前时间是否小于指定秒数
|
||
* @param {String|Number|Date} targetTime 目标时间(支持多格式)
|
||
* @param {Number} seconds 指定秒数(需为非负数字)
|
||
* @returns {Boolean} true=时间差小于指定秒数;false=时间差大于/等于指定秒数或参数异常
|
||
* @throws {Error} 当秒数参数不合法时抛出明确异常
|
||
*/
|
||
static isLessThanSpecifiedSeconds(targetTime, seconds) {
|
||
// 1. 严格校验秒数参数
|
||
if (typeof seconds !== 'number' || isNaN(seconds) || seconds < 0) {
|
||
throw new Error(`指定秒数不合法:${seconds},请传入非负数字(如 90、60)`);
|
||
}
|
||
|
||
// 2. 转换目标时间为毫秒级时间戳(内部私有方法处理多格式兼容)
|
||
const targetTimestamp = this._parseToMillisecondTimestamp(targetTime);
|
||
if (targetTimestamp === null) return false; // 时间格式不合法时返回false
|
||
|
||
// 3. 计算时间差(绝对值:兼容目标时间在当前时间之前/之后的场景)
|
||
const nowTimestamp = Date.now();
|
||
const timeDiffMs = Math.abs(nowTimestamp - targetTimestamp);
|
||
|
||
// 4. 转换指定秒数为毫秒,判断是否小于(核心逻辑)
|
||
const specifiedMs = seconds * 1000;
|
||
return timeDiffMs < specifiedMs;
|
||
}
|
||
|
||
/**
|
||
* 私有方法:统一转换任意时间格式为毫秒级时间戳
|
||
* @param {String|Number|Date} time 待转换的时间
|
||
* @returns {Number|null} 合法返回毫秒级时间戳,不合法返回null
|
||
*/
|
||
static _parseToMillisecondTimestamp(time) {
|
||
let timestamp;
|
||
|
||
// 情况1:传入的是数字(秒级/毫秒级时间戳)
|
||
if (typeof time === 'number') {
|
||
// 区分秒级戳(10位)和毫秒级戳(13位)
|
||
timestamp = time.toString().length <= 10 ? time * 1000 : time;
|
||
// 校验时间戳有效性
|
||
if (isNaN(timestamp) || timestamp < 0) {
|
||
console.error(`时间戳不合法:${time},需为非负数字`);
|
||
return null;
|
||
}
|
||
}
|
||
|
||
// 情况2:传入的是Date对象
|
||
else if (time instanceof Date) {
|
||
timestamp = time.getTime();
|
||
if (isNaN(timestamp)) {
|
||
console.error(`Date对象不合法:${time}`);
|
||
return null;
|
||
}
|
||
}
|
||
|
||
// 情况3:传入的是时间字符串(如 "2026-02-12 10:00:00"、"2026/02/12")
|
||
else if (typeof time === 'string') {
|
||
const date = new Date(time);
|
||
timestamp = date.getTime();
|
||
if (isNaN(timestamp)) {
|
||
console.error(`时间字符串格式不合法:${time},请使用如 "2026-02-12 10:00:00" 的格式`);
|
||
return null;
|
||
}
|
||
}
|
||
|
||
// 情况4:不支持的类型
|
||
else {
|
||
return null;
|
||
}
|
||
|
||
return timestamp;
|
||
}
|
||
}
|
||
export default TimeUtil;
|
||
|
||
// -------------------------- 测试用例 --------------------------
|
||
// // 测试1:目标时间是90秒前(判断是否小于100秒 → true)
|
||
// const test1 = TimeUtil.isLessThanSpecifiedSeconds(Date.now() - 90 * 1000, 100);
|
||
// console.log('测试1:', test1); // true
|
||
//
|
||
// // 测试2:目标时间是100秒前(判断是否小于90秒 → false)
|
||
// const test2 = TimeUtil.isLessThanSpecifiedSeconds(Date.now() - 100 * 1000, 90);
|
||
// console.log('测试2:', test2); // false
|
||
//
|
||
// // 测试3:传入时间字符串(判断是否小于60秒 → false)
|
||
// const test3Time = "2026-02-12 09:00:00";
|
||
// const test3 = TimeUtil.isLessThanSpecifiedSeconds(test3Time, 60);
|
||
// console.log('测试3:', test3); // false
|
||
//
|
||
// // 测试4:传入秒级时间戳(1740000000 → 转换为毫秒级,判断是否小于30秒)
|
||
// const test4 = TimeUtil.isLessThanSpecifiedSeconds(1740000000, 30);
|
||
// console.log('测试4:', test4); // 取决于当前时间,大概率false
|
||
//
|
||
// // 测试5:非法秒数(会抛出异常)
|
||
// try {
|
||
// TimeUtil.isLessThanSpecifiedSeconds(Date.now(), -10);
|
||
// } catch (e) {
|
||
// console.log('测试5(异常):', e.message); // 指定秒数不合法:-10,请传入非负数字
|
||
// }
|