/** * 公共函数库 * 包含日期时间、工具函数等 */ /** * 数字补零 * @param {number} num - 数字 * @param {number} len - 目标长度,默认2 * @returns {string} 补零后的字符串 * @example padZero(5) => '05' */ export function padZero(num, len = 2) { let str = String(num) while (str.length < len) { str = '0' + str } return str } /** * 获取日期字符串 yyyy-MM-dd * @param {Date|string|number} [date] - 日期,默认当前日期 * @param {string} [separator='-'] - 分隔符 * @returns {string} 日期字符串 * @example getDate() => '2026-05-21' */ export function getDate(date, separator = '-') { const d = date ? new Date(date) : new Date() const y = d.getFullYear() const m = padZero(d.getMonth() + 1) const day = padZero(d.getDate()) return `${y}${separator}${m}${separator}${day}` } /** * 获取时间字符串 HH:mm:ss * @param {Date|string|number} [date] - 日期,默认当前时间 * @param {string} [separator=':'] - 分隔符 * @returns {string} 时间字符串 * @example getTime() => '14:30:45' */ export function getTime(date, separator = ':') { const d = date ? new Date(date) : new Date() const h = padZero(d.getHours()) const m = padZero(d.getMinutes()) const s = padZero(d.getSeconds()) return `${h}${separator}${m}${separator}${s}` } /** * 获取日期时间字符串 yyyy-MM-dd HH:mm:ss * @param {Date|string|number} [date] - 日期,默认当前 * @param {string} [dateSep='-'] - 日期分隔符 * @param {string} [timeSep=':'] - 时间分隔符 * @param {string} [dtSep=' '] - 日期和时间之间的分隔符 * @returns {string} 日期时间字符串 * @example getDateTime() => '2026-05-21 14:30:45' */ export function getDateTime(date, dateSep = '-', timeSep = ':', dtSep = ' ') { return `${getDate(date, dateSep)}${dtSep}${getTime(date, timeSep)}` } /** * 自定义格式化日期 * @param {Date|string|number} date - 日期 * @param {string} format - 格式字符串,支持 YYYY MM DD HH mm ss 占位符 * @returns {string} 格式化后的日期字符串 * @example formatDate(new Date(), 'YYYY/MM/DD HH:mm') => '2026/05/21 14:30' */ export function formatDate(date, format = 'YYYY-MM-DD HH:mm:ss') { const d = new Date(date) const map = { YYYY: d.getFullYear(), MM: padZero(d.getMonth() + 1), DD: padZero(d.getDate()), HH: padZero(d.getHours()), mm: padZero(d.getMinutes()), ss: padZero(d.getSeconds()) } return format.replace(/YYYY|MM|DD|HH|mm|ss/g, (match) => map[match]) } /** * 获取相对日期 * @param {number} days - 天数偏移,正数为之后,负数为之前 * @param {Date|string|number} [baseDate] - 基准日期,默认今天 * @returns {string} 日期字符串 yyyy-MM-dd * @example getRelativeDate(-7) => 7天前的日期 * @example getRelativeDate(3) => 3天后的日期 */ export function getRelativeDate(days, baseDate) { const d = baseDate ? new Date(baseDate) : new Date() d.setDate(d.getDate() + days) return getDate(d) } /** * 获取本周一的日期 * @param {Date|string|number} [date] - 日期,默认今天 * @returns {string} yyyy-MM-dd * @example getWeekStartDate() => '2026-05-18' */ export function getWeekStartDate(date) { const d = date ? new Date(date) : new Date() const day = d.getDay() const diff = day === 0 ? -6 : 1 - day d.setDate(d.getDate() + diff) return getDate(d) } /** * 获取本月1号的日期 * @param {Date|string|number} [date] - 日期,默认今天 * @returns {string} yyyy-MM-dd */ export function getMonthStartDate(date) { const d = date ? new Date(date) : new Date() d.setDate(1) return getDate(d) } /** * 时间戳转日期字符串 * @param {number} timestamp - 时间戳(毫秒) * @param {string} [format='YYYY-MM-DD HH:mm:ss'] - 格式 * @returns {string} 日期字符串 * @example timestampToDate(1716268800000) => '2024-05-21 14:40:00' */ export function timestampToDate(timestamp, format = 'YYYY-MM-DD HH:mm:ss') { return formatDate(new Date(timestamp), format) } /** * 日期字符串转时间戳 * @param {string} dateStr - 日期字符串,如 '2026-05-21' 或 '2026-05-21 14:30:45' * @returns {number} 时间戳(毫秒) */ export function dateToTimestamp(dateStr) { return new Date(dateStr.replace(/-/g, '/')).getTime() } /** * 计算两个日期之间的天数差 * @param {Date|string|number} date1 * @param {Date|string|number} date2 * @returns {number} date1 - date2 的天数差 * @example daysBetween('2026-05-25', '2026-05-21') => 4 */ export function daysBetween(date1, date2) { const d1 = new Date(date1) const d2 = new Date(date2) const diff = d1.getTime() - d2.getTime() return Math.round(diff / (1000 * 60 * 60 * 24)) } /** * 判断是否为今天 * @param {Date|string|number} date * @returns {boolean} */ export function isToday(date) { const d = new Date(date) const today = new Date() return d.getFullYear() === today.getFullYear() && d.getMonth() === today.getMonth() && d.getDate() === today.getDate() } /** * 生成唯一ID * @param {string} [prefix=''] - 前缀 * @returns {string} * @example generateId('DEV_') => 'DEV_lrx8a2b3c' */ export function generateId(prefix = '') { return prefix + Date.now().toString(36) + Math.random().toString(36).slice(2, 8) } /** * 深拷贝 * @param {*} obj - 要拷贝的对象 * @returns {*} 拷贝后的新对象 */ export function deepClone(obj) { if (obj === null || typeof obj !== 'object') return obj if (obj instanceof Date) return new Date(obj.getTime()) if (Array.isArray(obj)) return obj.map(item => deepClone(item)) const cloned = {} for (const key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { cloned[key] = deepClone(obj[key]) } } return cloned } /** * 防抖函数 * @param {Function} fn - 要防抖的函数 * @param {number} [delay=300] - 延迟时间(毫秒) * @returns {Function} */ export function debounce(fn, delay = 300) { let timer = null return function (...args) { if (timer) clearTimeout(timer) timer = setTimeout(() => { fn.apply(this, args) }, delay) } } /** * 节流函数 * @param {Function} fn - 要节流的函数 * @param {number} [interval=300] - 间隔时间(毫秒) * @returns {Function} */ export function throttle(fn, interval = 300) { let lastTime = 0 return function (...args) { const now = Date.now() if (now - lastTime >= interval) { lastTime = now fn.apply(this, args) } } } export default { padZero, getDate, getTime, getDateTime, formatDate, getRelativeDate, getWeekStartDate, getMonthStartDate, timestampToDate, dateToTimestamp, daysBetween, isToday, generateId, deepClone, debounce, throttle }