You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

110 lines
3.1 KiB

// 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时间戳
*/
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();
}
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');
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 timestamp = getUtc8Timestamp(date);
const utc8Date = new Date(timestamp);
return utc8Date.toLocaleString('zh-CN', { ...defaultOptions, ...options });
}
/**
* 设置固定时间模式
* @param {boolean} mode - true启用false禁用
*/
function setFixedTimeMode(mode) {
isFixedTimeMode = mode;
}
/**
* 获取固定时间模式状态
* @returns {boolean} 当前固定时间模式状态
*/
function getFixedTimeMode() {
return isFixedTimeMode;
}
// 导出函数
module.exports = {
getUtc8Timestamp,
getUtc8Date,
toUtc8ISOString,
toUtc8String,
setFixedTimeMode,
getFixedTimeMode,
// 向后兼容别名
getBeijingTimeTimestamp: getUtc8Timestamp,
getBeijingTimeDate: getUtc8Date,
toBeijingTimeISOString: toUtc8ISOString,
toBeijingTimeString: toUtc8String
};