/** * 格式化秒数为年、月、日、时、分、秒的字符串表示 * @param {number} seconds - 秒数 * @returns {string} 格式化后的字符串,例如:"1年2月3日4时5分6秒" * @example * formatSeconds(30); // 30秒 * formatSeconds(3600); // 1时1分 */ export function formatSeconds(seconds: number) { // 处理 NaN 和无效输入 if (isNaN(seconds) || seconds === null || seconds === undefined) { return '' } // 处理边界情况:0秒 if (seconds === 0) return '0秒' // 确保输入为整数 seconds = Math.floor(Number(seconds)) // 计算各时间单位 const totalDays = Math.floor(seconds / 86400) const years = Math.floor(totalDays / 365) const months = Math.floor((totalDays % 365) / 30) const days = (totalDays % 365) % 30 const hours = Math.floor(seconds / 3600) % 24 const minutes = Math.floor((seconds % 3600) / 60) const secs = seconds % 60 // 构建结果数组(自动过滤0值) const parts = [] if (years > 0) parts.push(`${years}年`) if (months > 0) parts.push(`${months}月`) if (days > 0) { parts.push(`${days}日`) parts.push(`${days}天`) } if (hours > 0) parts.push(`${hours}时`) if (minutes > 0) parts.push(`${minutes}分`) if (secs > 0) parts.push(`${secs}秒`) // 处理所有单位都是0的情况(当seconds为小数时可能发生) return parts.length > 0 ? parts.join('') : '0秒' } /** * * @param d 日期对象 * @returns 格式化后的日期时间字符串,例如:"2025-01-01 12:00:00" */ export function formatDateTime(d: Date) { const pad = (n: number) => String(n).padStart(2, '0') return `${d.getFullYear()}-${pad(d.getMonth() + 1)}-${pad(d.getDate())} ${pad(d.getHours())}:${pad(d.getMinutes())}:${pad(d.getSeconds())}` } /** * 获取坐标位置 */ /** * 获取坐标位置 * @note 雷达的检测范围 * @param xstart x 开始坐标 * @param xend x 结束坐标 * @param ystart y 开始坐标 * @param yend y 结束坐标 * @note 配置家具时,点击的家具元素的坐标 * @param offsetLeft 元素基于父容器的X坐标 * @param offsetTop 元素基于父容器的Y坐标 */ export const getOriginPosition = ( [xstart, xend, ystart, yend]: number[], [offsetLeft, offsetTop]: number[] ) => { // 容器宽高 const containerWidth = Math.abs(xstart) + Math.abs(xend) const containerHeight = Math.abs(ystart) + Math.abs(yend) // 原点在容器中的坐标 const originX = Math.abs(xstart) const originY = Math.abs(yend) // 元素基于父容器的偏移量 const offsetX = offsetLeft ?? 0 const offsetY = offsetTop ?? 0 // 元素基于原点的偏移量 const originOffsetX = offsetX - originX const originOffsetY = originY - offsetY // 雷达尺寸 const radarWidth = 20 const radarHeight = 20 // 雷达基于原点的偏移量 const radarX = Math.round(originX - radarWidth / 2) const radarY = Math.round(originY - radarHeight / 2) const data = { width: containerWidth, // 容器宽度 height: containerHeight, // 容器高度 originX: Math.round(originX), // 原点X坐标 originY: Math.round(originY), // 原点Y坐标 offsetX: Math.round(offsetX), // 元素基于父容器的偏移量 X坐标 offsetY: Math.round(offsetY), // 元素基于父容器的偏移量 Y坐标 originOffsetX: Math.round(originOffsetX), // 元素基于原点的偏移量 X坐标 originOffsetY: Math.round(originOffsetY), // 元素基于原点的偏移量 Y坐标 radarX, // 雷达X坐标 radarY, // 雷达Y坐标 radarWidth, // 雷达宽度 radarHeight, // 雷达高度 } return data }