|
|
const config = require('../../config/config') |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
function formatDateWithTimezone(date, includeTimezone = true) { |
|
|
|
|
|
let dateObj |
|
|
if (typeof date === 'number') { |
|
|
|
|
|
|
|
|
if (date < 10000000000) { |
|
|
dateObj = new Date(date * 1000) |
|
|
} else { |
|
|
dateObj = new Date(date) |
|
|
} |
|
|
} else if (date instanceof Date) { |
|
|
dateObj = date |
|
|
} else { |
|
|
dateObj = new Date(date) |
|
|
} |
|
|
|
|
|
|
|
|
const timezoneOffset = config.system.timezoneOffset || 8 |
|
|
|
|
|
|
|
|
const offsetMs = timezoneOffset * 3600000 |
|
|
const localTime = new Date(dateObj.getTime() + offsetMs) |
|
|
|
|
|
|
|
|
const year = localTime.getUTCFullYear() |
|
|
const month = String(localTime.getUTCMonth() + 1).padStart(2, '0') |
|
|
const day = String(localTime.getUTCDate()).padStart(2, '0') |
|
|
const hours = String(localTime.getUTCHours()).padStart(2, '0') |
|
|
const minutes = String(localTime.getUTCMinutes()).padStart(2, '0') |
|
|
const seconds = String(localTime.getUTCSeconds()).padStart(2, '0') |
|
|
|
|
|
let formattedDate = `${year}-${month}-${day} ${hours}:${minutes}:${seconds}` |
|
|
|
|
|
|
|
|
if (includeTimezone) { |
|
|
const sign = timezoneOffset >= 0 ? '+' : '' |
|
|
formattedDate += ` (UTC${sign}${timezoneOffset})` |
|
|
} |
|
|
|
|
|
return formattedDate |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
function getISOStringWithTimezone(date) { |
|
|
|
|
|
const localTimeStr = formatDateWithTimezone(date, false) |
|
|
|
|
|
|
|
|
const timezoneOffset = config.system.timezoneOffset || 8 |
|
|
|
|
|
|
|
|
const sign = timezoneOffset >= 0 ? '+' : '-' |
|
|
const absOffset = Math.abs(timezoneOffset) |
|
|
const offsetHours = String(Math.floor(absOffset)).padStart(2, '0') |
|
|
const offsetMinutes = String(Math.round((absOffset % 1) * 60)).padStart(2, '0') |
|
|
|
|
|
|
|
|
return `${localTimeStr.replace(' ', 'T')}${sign}${offsetHours}:${offsetMinutes}` |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
function formatDuration(seconds) { |
|
|
if (seconds < 60) { |
|
|
return `${seconds}秒` |
|
|
} else if (seconds < 3600) { |
|
|
const minutes = Math.floor(seconds / 60) |
|
|
return `${minutes}分钟` |
|
|
} else if (seconds < 86400) { |
|
|
const hours = Math.floor(seconds / 3600) |
|
|
const minutes = Math.floor((seconds % 3600) / 60) |
|
|
return minutes > 0 ? `${hours}小时${minutes}分钟` : `${hours}小时` |
|
|
} else { |
|
|
const days = Math.floor(seconds / 86400) |
|
|
const hours = Math.floor((seconds % 86400) / 3600) |
|
|
return hours > 0 ? `${days}天${hours}小时` : `${days}天` |
|
|
} |
|
|
} |
|
|
|
|
|
module.exports = { |
|
|
formatDateWithTimezone, |
|
|
getISOStringWithTimezone, |
|
|
formatDuration |
|
|
} |
|
|
|