js根据日期判断星座的示例代码



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月份的天数(尤其是闰年)时可能会有些复杂,因为每个月的天数不同,这里为了简化处理,假设了每个月的天数都是固定的,这在大多数情况下是可行的,但在处理极端情况时可能会出错。

另外,上述代码中的日期范围是基于公历的,并且假设输入的日期是有效的。如果输入的日期无效(例如,月份超出范围或日期超出该月的天数),则上述代码可能会产生不可预测的结果。在实际应用中,你可能需要添加额外的错误处理逻辑来确保日期的有效性。