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时间戳 |
|||
* @param {Date|number} date - 可选,日期对象或时间戳 |
|||
* @returns {number} UTC+8时间戳 |
|||
* 格式化日期时间为相对时间(如:刚刚、1分钟前、2小时前等) |
|||
* @param {string|Date} dateTime - 日期时间(可以是ISO字符串或Date对象) |
|||
* @returns {string} 格式化后的相对时间 |
|||
*/ |
|||
function getUtc8Timestamp(date) { |
|||
let baseTimestamp; |
|||
if (isFixedTimeMode) { |
|||
baseTimestamp = FIXED_UTC8_TIME; |
|||
} else if (!date) { |
|||
baseTimestamp = Date.now(); |
|||
} else if (typeof date === 'number') { |
|||
baseTimestamp = date; |
|||
} else { |
|||
baseTimestamp = date.getTime(); |
|||
function formatRelativeTime(dateTime) { |
|||
if (!dateTime) { |
|||
return '刚刚'; |
|||
} |
|||
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(); |
|||
const month = String(utcDate.getUTCMonth() + 1).padStart(2, '0'); |
|||
const day = String(utcDate.getUTCDate()).padStart(2, '0'); |
|||
const hours = String(utcDate.getUTCHours()).padStart(2, '0'); |
|||
const minutes = String(utcDate.getUTCMinutes()).padStart(2, '0'); |
|||
const seconds = String(utcDate.getUTCSeconds()).padStart(2, '0'); |
|||
const milliseconds = String(utcDate.getUTCMilliseconds()).padStart(3, '0'); |
|||
// 确保输入是Date对象
|
|||
const date = typeof dateTime === 'string' ? new Date(dateTime) : dateTime; |
|||
if (isNaN(date.getTime())) { |
|||
return '刚刚'; |
|||
} |
|||
|
|||
return `${year}-${month}-${day}T${hours}:${minutes}:${seconds}.${milliseconds}+08:00`; |
|||
} |
|||
|
|||
/** |
|||
* 将时间转换为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 now = new Date(); |
|||
const diff = now - date; |
|||
|
|||
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 }); |
|||
} |
|||
|
|||
/** |
|||
* 设置固定时间模式 |
|||
* @param {boolean} mode - true启用,false禁用 |
|||
*/ |
|||
function setFixedTimeMode(mode) { |
|||
isFixedTimeMode = mode; |
|||
// 根据时间差返回不同的格式
|
|||
if (seconds < 60) { |
|||
return '刚刚'; |
|||
} else if (minutes < 60) { |
|||
return `${minutes}分钟前`; |
|||
} else if (hours < 24) { |
|||
return `${hours}小时前`; |
|||
} else if (days < 7) { |
|||
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}`; |
|||
} |
|||
} |
|||
|
|||
/** |
|||
* 获取固定时间模式状态 |
|||
* @returns {boolean} 当前固定时间模式状态 |
|||
* 格式化日期为YYYY-MM-DD HH:MM:SS格式 |
|||
* @param {string|Date} dateTime - 日期时间(可以是ISO字符串或Date对象) |
|||
* @returns {string} 格式化后的日期时间 |
|||
*/ |
|||
function getFixedTimeMode() { |
|||
return isFixedTimeMode; |
|||
function formatDateTime(dateTime) { |
|||
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 = { |
|||
getUtc8Timestamp, |
|||
getUtc8Date, |
|||
toUtc8ISOString, |
|||
toUtc8String, |
|||
setFixedTimeMode, |
|||
getFixedTimeMode, |
|||
// 向后兼容别名
|
|||
getBeijingTimeTimestamp: getUtc8Timestamp, |
|||
getBeijingTimeDate: getUtc8Date, |
|||
toBeijingTimeISOString: toUtc8ISOString, |
|||
toBeijingTimeString: toUtc8String |
|||
}; |
|||
formatRelativeTime, |
|||
formatDateTime |
|||
}; |
|||
|
|||
Loading…
Reference in new issue