如何在JavaScript中比较日期字符串?星座判断函数异常求助
问题分析
- 条件判断上下限完全写反:每个
else if里的<=和>=对应的数值搞反了,比如第一个条件date <= '20.04' && date >= '21.03',没有任何日期能同时满足小于等于'20.04'且大于等于'21.03'(字符串比较中'21.03' > '20.04'),导致所有条件都无法匹配,最终只会走到else返回'Fish'。 - 日期格式导致比较逻辑错误:用
日.月格式的字符串比较日期完全不可靠,比如'31.01'(1月31日)字符串比较会大于'01.02'(2月1日),但实际日期更早,根本没法正确判断先后。 - 变量未声明:
zodiak_name没加let/const声明,会污染全局作用域。 - 星座范围与名称错误:部分星座的日期范围不对,还使用了非标准的英文名称(比如Twins应为Gemini,Lion应为Leo等)。
修复后的代码
function getZodiac(dateStr) { // 把输入的"日.月"转成"月.日",保证字符串比较逻辑正确 const [day, month] = dateStr.split('.'); const formattedDate = `${month}.${day}`; let zodiacName; if (formattedDate >= '03.21' && formattedDate <= '04.19') { zodiacName = 'Aries(白羊座)'; } else if (formattedDate >= '04.20' && formattedDate <= '05.20') { zodiacName = 'Taurus(金牛座)'; } else if (formattedDate >= '05.21' && formattedDate <= '06.20') { zodiacName = 'Gemini(双子座)'; } else if (formattedDate >= '06.21' && formattedDate <= '07.22') { zodiacName = 'Cancer(巨蟹座)'; } else if (formattedDate >= '07.23' && formattedDate <= '08.22') { zodiacName = 'Leo(狮子座)'; } else if (formattedDate >= '08.23' && formattedDate <= '09.22') { zodiacName = 'Virgo(处女座)'; } else if (formattedDate >= '09.23' && formattedDate <= '10.23') { zodiacName = 'Libra(天秤座)'; } else if (formattedDate >= '10.24' && formattedDate <= '11.22') { zodiacName = 'Scorpio(天蝎座)'; } else if (formattedDate >= '11.23' && formattedDate <= '12.21') { zodiacName = 'Sagittarius(射手座)'; } else if (formattedDate >= '12.22' || formattedDate <= '01.19') { zodiacName = 'Capricorn(摩羯座)'; } else if (formattedDate >= '01.20' && formattedDate <= '02.18') { zodiacName = 'Aquarius(水瓶座)'; } else { zodiacName = 'Pisces(双鱼座)'; } return zodiacName; }
修复说明
- 修正条件逻辑:把每个星座的日期范围上下限调整正确,确保判断逻辑能触发。
- 调整日期格式:将输入的"日.月"转为"月.日",这样字符串比较时会先按月份排序,再按日期排序,符合实际日期的先后顺序。
- 规范变量声明:用
let声明zodiacName,避免污染全局变量。 - 修正星座信息:改用标准的星座英文名称,同时调整到通用的日期范围(比如摩羯座跨12月和1月,用
||处理跨年度的情况)。
内容的提问来源于stack exchange,提问作者Ilya
相关产品推荐
相关产品推荐

