// 工具函数:格式化日期 // 参数: // - date: 可传入 时间戳(毫秒)、Date对象、日期字符串(如 "2024-09-12") // - format: 格式化模板(默认 "YYYY-MM-DD") function formatDate(date, format = "YYYY-MM-DD") { // 处理输入:统一转为 Date 对象 if (!date) { date = new Date(); // 默认当前时间 } else if (typeof date === "number") { date = new Date(date); // 时间戳转 Date } else if (typeof date === "string") { date = new Date(date); // 日期字符串转 Date } // 处理无效日期 if (isNaN(date.getTime())) { console.error("无效的日期格式"); return ""; } // 提取日期部分 const year = date.getFullYear(); const month = date.getMonth() + 1; // 月份从 0 开始,需 +1 const day = date.getDate(); const hour = date.getHours(); const minute = date.getMinutes(); const second = date.getSeconds(); // 补零函数(将 1 转为 "01") const padZero = (num) => String(num).padStart(2, "0"); // 替换格式模板 return format .replace("YYYY", year) .replace("MM", padZero(month)) .replace("DD", padZero(day)) .replace("HH", padZero(hour)) .replace("mm", padZero(minute)) .replace("ss", padZero(second)); } /** * 计算n年前的日期 * @param {number} n - 年前数(如1表示1年前,2表示2年前) * @param {Date|number|string} [baseDate] - 基准日期(可选,默认当前日期) * @returns {Date} 计算后的Date对象 */ function getNYearsAgo(n, baseDate) { // 处理基准日期(默认当前日期) let date; if (!baseDate) { date = new Date(); // 默认以今天为基准 } else if (typeof baseDate === 'number') { date = new Date(baseDate); // 时间戳转Date } else if (typeof baseDate === 'string') { date = new Date(baseDate); // 日期字符串转Date } else { date = new Date(baseDate); // 传入Date对象 } // 校验日期有效性 if (isNaN(date.getTime())) { console.error('无效的基准日期'); return null; } // 获取基准日期的年、月、日 const year = date.getFullYear(); const month = date.getMonth(); // 月份从0开始(0=1月,11=12月) const day = date.getDate(); // 计算n年前的年份 const targetYear = year - n; // 创建目标日期(直接设置年份) const targetDate = new Date(targetYear, month, day); // 特殊情况处理:如果目标日期的月份与原月份不一致(如2月29日跨年到非闰年) if (targetDate.getMonth() !== month) { // 说明原日期在目标年份中不存在(如2024-02-29 → 2023年没有2月29日) // 自动调整为目标月份的最后一天 targetDate.setDate(0); // setDate(0) 表示上个月的最后一天 } return targetDate; } /** * 根据出生日期计算年龄 * @param {string|Date} birthDate - 出生日期(支持字符串如"1990-05-15"或Date对象) * @returns {number} 年龄(如28),若日期无效则返回-1 */ function calculateAge(birthDate) { // 处理出生日期输入(转为Date对象) let birth; if (birthDate instanceof Date) { birth = birthDate; } else if (typeof birthDate === 'string') { birth = new Date(birthDate); } else { console.error('出生日期格式错误'); return -1; } // 校验出生日期有效性 if (isNaN(birth.getTime())) { console.error('无效的出生日期'); return -1; } // 获取当前日期和出生日期的年/月/日 const today = new Date(); const birthYear = birth.getFullYear(); const birthMonth = birth.getMonth(); // 月份从0开始(0=1月) const birthDay = birth.getDate(); const currentYear = today.getFullYear(); const currentMonth = today.getMonth(); const currentDay = today.getDate(); // 计算年份差(初步年龄) let age = currentYear - birthYear; // 调整年龄:若今年生日尚未过,则年龄减1 if ( currentMonth < birthMonth || // 当前月份 < 出生月份 → 生日未过 (currentMonth === birthMonth && currentDay < birthDay) // 同月份但当前日期 < 出生日期 → 生日未过 ) { age--; } // 年龄不能为负数(如出生日期在未来) return age < 0 ? 0 : age; } /** * 根据生日计算星座 * @param {number|string} month - 月份(1-12) * @param {number|string} day - 日期(1-31) * @returns {string} 星座名称,如"白羊座"、"金牛座"等 */ function calculateConstellation(month, day) { // 确保 month 和 day 是数字类型 const m = typeof month === 'string' ? parseInt(month, 10) : month; const d = typeof day === 'string' ? parseInt(day, 10) : day; // 验证输入 if (!m || !d || m < 1 || m > 12 || d < 1 || d > 31) { return ''; } // 根据月份和日期判断星座 if ((m === 3 && d >= 21) || (m === 4 && d <= 19)) return "白羊座"; if ((m === 4 && d >= 20) || (m === 5 && d <= 20)) return "金牛座"; if ((m === 5 && d >= 21) || (m === 6 && d <= 21)) return "双子座"; if ((m === 6 && d >= 22) || (m === 7 && d <= 22)) return "巨蟹座"; if ((m === 7 && d >= 23) || (m === 8 && d <= 22)) return "狮子座"; if ((m === 8 && d >= 23) || (m === 9 && d <= 22)) return "处女座"; if ((m === 9 && d >= 23) || (m === 10 && d <= 23)) return "天秤座"; if ((m === 10 && d >= 24) || (m === 11 && d <= 22)) return "天蝎座"; if ((m === 11 && d >= 23) || (m === 12 && d <= 21)) return "射手座"; if ((m === 12 && d >= 22) || (m === 1 && d <= 19)) return "摩羯座"; if ((m === 1 && d >= 20) || (m === 2 && d <= 18)) return "水瓶座"; return "双鱼座"; } /** * 根据生日字符串计算星座 * @param {string} birthday - 生日字符串,格式:YYYY-MM-DD * @returns {string} 星座名称,如"白羊座"、"金牛座"等 */ function calculateConstellationFromBirthday(birthday) { if (!birthday || typeof birthday !== 'string') { return ''; } try { const parts = birthday.split('-'); if (parts.length !== 3) { return ''; } const month = parseInt(parts[1], 10); const day = parseInt(parts[2], 10); return calculateConstellation(month, day); } catch (error) { console.error('计算星座失败:', error); return ''; } } module.exports = { formatDate: formatDate, getNYearsAgo: getNYearsAgo, calculateAge: calculateAge, calculateConstellation: calculateConstellation, calculateConstellationFromBirthday: calculateConstellationFromBirthday }