8 changed files with 1412 additions and 106 deletions
@ -1,110 +1,74 @@ |
|||||
// UTC+8时间处理工具函数
|
|
||||
|
|
||||
// 固定时间戳(北京时间:2025-12-19 17:10:35.186)
|
|
||||
const FIXED_UTC8_TIME = 1766135435186; |
|
||||
let isFixedTimeMode = false; // 默认关闭固定时间模式
|
|
||||
|
|
||||
/** |
/** |
||||
* 获取UTC+8时间戳 |
* 格式化日期时间为相对时间(如:刚刚、1分钟前、2小时前等) |
||||
* @param {Date|number} date - 可选,日期对象或时间戳 |
* @param {string|Date} dateTime - 日期时间(可以是ISO字符串或Date对象) |
||||
* @returns {number} UTC+8时间戳 |
* @returns {string} 格式化后的相对时间 |
||||
*/ |
*/ |
||||
function getUtc8Timestamp(date) { |
function formatRelativeTime(dateTime) { |
||||
let baseTimestamp; |
if (!dateTime) { |
||||
if (isFixedTimeMode) { |
return '刚刚'; |
||||
baseTimestamp = FIXED_UTC8_TIME; |
|
||||
} else if (!date) { |
|
||||
baseTimestamp = Date.now(); |
|
||||
} else if (typeof date === 'number') { |
|
||||
baseTimestamp = date; |
|
||||
} else { |
|
||||
baseTimestamp = date.getTime(); |
|
||||
} |
} |
||||
return baseTimestamp + 8 * 60 * 60 * 1000; // 手动加8小时
|
|
||||
} |
|
||||
|
|
||||
/** |
|
||||
* 获取UTC+8 Date对象 |
|
||||
* @param {number} timestamp - 可选,时间戳 |
|
||||
* @returns {Date} UTC+8 Date对象 |
|
||||
*/ |
|
||||
function getUtc8Date(timestamp) { |
|
||||
const ts = isFixedTimeMode ? FIXED_UTC8_TIME : (timestamp || Date.now()); |
|
||||
const date = new Date(ts + 8 * 60 * 60 * 1000); // 手动加8小时
|
|
||||
return date; |
|
||||
} |
|
||||
|
|
||||
/** |
|
||||
* 将时间转换为UTC+8的ISO字符串(带时区信息) |
|
||||
* @param {Date|number} date - 可选,日期对象或时间戳 |
|
||||
* @returns {string} ISO格式的UTC+8时间字符串 |
|
||||
*/ |
|
||||
function toUtc8ISOString(date) { |
|
||||
const timestamp = getUtc8Timestamp(date); |
|
||||
const utcDate = new Date(timestamp); |
|
||||
|
|
||||
const year = utcDate.getUTCFullYear(); |
// 确保输入是Date对象
|
||||
const month = String(utcDate.getUTCMonth() + 1).padStart(2, '0'); |
const date = typeof dateTime === 'string' ? new Date(dateTime) : dateTime; |
||||
const day = String(utcDate.getUTCDate()).padStart(2, '0'); |
if (isNaN(date.getTime())) { |
||||
const hours = String(utcDate.getUTCHours()).padStart(2, '0'); |
return '刚刚'; |
||||
const minutes = String(utcDate.getUTCMinutes()).padStart(2, '0'); |
} |
||||
const seconds = String(utcDate.getUTCSeconds()).padStart(2, '0'); |
|
||||
const milliseconds = String(utcDate.getUTCMilliseconds()).padStart(3, '0'); |
|
||||
|
|
||||
return `${year}-${month}-${day}T${hours}:${minutes}:${seconds}.${milliseconds}+08:00`; |
// 计算时间差(毫秒)
|
||||
} |
const now = new Date(); |
||||
|
const diff = now - date; |
||||
/** |
|
||||
* 将时间转换为UTC+8的本地字符串 |
|
||||
* @param {Date|number} date - 可选,日期对象或时间戳 |
|
||||
* @param {Object} options - 可选,格式化选项 |
|
||||
* @returns {string} 本地化的UTC+8时间字符串 |
|
||||
*/ |
|
||||
function toUtc8String(date, options = {}) { |
|
||||
const defaultOptions = { |
|
||||
year: 'numeric', |
|
||||
month: '2-digit', |
|
||||
day: '2-digit', |
|
||||
hour: '2-digit', |
|
||||
minute: '2-digit', |
|
||||
second: '2-digit', |
|
||||
hour12: false |
|
||||
// 移除timeZone设置,因为getUtc8Timestamp已经返回UTC+8时间戳
|
|
||||
}; |
|
||||
|
|
||||
const timestamp = getUtc8Timestamp(date); |
// 转换为不同的时间单位
|
||||
const utc8Date = new Date(timestamp); |
const seconds = Math.floor(diff / 1000); |
||||
|
const minutes = Math.floor(seconds / 60); |
||||
|
const hours = Math.floor(minutes / 60); |
||||
|
const days = Math.floor(hours / 24); |
||||
|
|
||||
return utc8Date.toLocaleString('zh-CN', { ...defaultOptions, ...options }); |
// 根据时间差返回不同的格式
|
||||
} |
if (seconds < 60) { |
||||
|
return '刚刚'; |
||||
/** |
} else if (minutes < 60) { |
||||
* 设置固定时间模式 |
return `${minutes}分钟前`; |
||||
* @param {boolean} mode - true启用,false禁用 |
} else if (hours < 24) { |
||||
*/ |
return `${hours}小时前`; |
||||
function setFixedTimeMode(mode) { |
} else if (days < 7) { |
||||
isFixedTimeMode = mode; |
return `${days}天前`; |
||||
|
} else { |
||||
|
// 超过7天显示具体日期
|
||||
|
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}`; |
||||
|
} |
||||
} |
} |
||||
|
|
||||
/** |
/** |
||||
* 获取固定时间模式状态 |
* 格式化日期为YYYY-MM-DD HH:MM:SS格式 |
||||
* @returns {boolean} 当前固定时间模式状态 |
* @param {string|Date} dateTime - 日期时间(可以是ISO字符串或Date对象) |
||||
|
* @returns {string} 格式化后的日期时间 |
||||
*/ |
*/ |
||||
function getFixedTimeMode() { |
function formatDateTime(dateTime) { |
||||
return isFixedTimeMode; |
if (!dateTime) { |
||||
|
return ''; |
||||
|
} |
||||
|
|
||||
|
// 确保输入是Date对象
|
||||
|
const date = typeof dateTime === 'string' ? new Date(dateTime) : dateTime; |
||||
|
if (isNaN(date.getTime())) { |
||||
|
return ''; |
||||
|
} |
||||
|
|
||||
|
const year = date.getFullYear(); |
||||
|
const month = String(date.getMonth() + 1).padStart(2, '0'); |
||||
|
const day = String(date.getDate()).padStart(2, '0'); |
||||
|
const hours = String(date.getHours()).padStart(2, '0'); |
||||
|
const minutes = String(date.getMinutes()).padStart(2, '0'); |
||||
|
const seconds = String(date.getSeconds()).padStart(2, '0'); |
||||
|
|
||||
|
return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`; |
||||
} |
} |
||||
|
|
||||
// 导出函数
|
|
||||
module.exports = { |
module.exports = { |
||||
getUtc8Timestamp, |
formatRelativeTime, |
||||
getUtc8Date, |
formatDateTime |
||||
toUtc8ISOString, |
}; |
||||
toUtc8String, |
|
||||
setFixedTimeMode, |
|
||||
getFixedTimeMode, |
|
||||
// 向后兼容别名
|
|
||||
getBeijingTimeTimestamp: getUtc8Timestamp, |
|
||||
getBeijingTimeDate: getUtc8Date, |
|
||||
toBeijingTimeISOString: toUtc8ISOString, |
|
||||
toBeijingTimeString: toUtc8String |
|
||||
}; |
|
||||
|
|||||
Loading…
Reference in new issue