function getZodiacSign(date) {
const month = date.getMonth() + 1; // getMonth() 返回的是 0-11,所以需要 +1
const day = date.getDate();
// 星座日期划分
const zodiacSigns = [
['摩羯座', [12/22, 1/19]],
['水瓶座', [1/20, 2/18]],
['双鱼座', [2/19, 3/20]],
['白羊座', [3/21, 4/19]],
['金牛座', [4/20, 5/20]],
['双子座', [5/21, 6/21]],
['巨蟹座', [6/22, 7/22]],
['狮子座', [7/23, 8/22]],
['处女座', [8/23, 9/22]],
['天秤座', [9/23, 10/23]],
['天蝎座', [10/24, 11/22]],
['射手座', [11/23, 12/21]]
];
// 注意:这里的日期是按照公历来的,且月份和日期均使用小数形式
// 数组中的日期是 [开始日期, 结束日期] 的小数形式,例如 [3/21, 4/19] 代表3月21日到4月19日
// 将输入的日期转换为小数形式
const dateInDecimal = month + day / (new Date(date.getFullYear(), month, 0).getDate());
// 遍历星座数组,找到对应的星座
for (let sign of zodiacSigns) {
if (dateInDecimal >= sign[1][0] && dateInDecimal <= sign[1][1]) {
return sign[0];
}
}
// 如果日期不在任何星座范围内,返回'未知'
return '未知';
}
// 示例用法
const birthDate = new Date('2024-09-12'); // 注意:这里使用的是'YYYY-MM-DD'格式
console.log(getZodiacSign(birthDate)); // 应输出 '处女座'
注意:由于JavaScript中月份是从0开始的,因此在比较月份时需要加1。同时,为了处理跨月星座边界的日期(例如星座最后一天和第一天),这里使用了小数形式来表示日期,其中月份是整数,日期是月份内的小数部分。这种方法在处理星座边界时比较直观且易于理解。但是,需要注意的是,这种方法在处理2月份的天数(尤其是闰年)时可能会有些复杂,因为每个月的天数不同,这里为了简化处理,假设了每个月的天数都是固定的,这在大多数情况下是可行的,但在处理极端情况时可能会出错。
另外,上述代码中的日期范围是基于公历的,并且假设输入的日期是有效的。如果输入的日期无效(例如,月份超出范围或日期超出该月的天数),则上述代码可能会产生不可预测的结果。在实际应用中,你可能需要添加额外的错误处理逻辑来确保日期的有效性。