【问题标题】:Conditional statement - determing season条件语句 - 确定季节
【发布时间】:2021-01-11 13:06:17
【问题描述】:

我正在根据具体提供的日期来确定季节。下面是我的代码,它可以工作,但必须有更好的方法...... 我想为我的解决方案使用条件语句。 输入是:

  • 字符串形式的月份
  • 日期为数字

赛季开始日期 春天 3 月 20 日, 夏季 6 月 21 日, 秋季 9 月 22 日, 冬季 12 月 21 日

任何帮助将不胜感激!

let month = 'Dec';
let day = 23;

if(month === 'Apr' || month === 'May') {
    console.log('Spring');
    } else if((day >= 20 && month === 'Mar') || (day < 21 && month === 'Jun')) {
        console.log('Spring');
    } else if(month === 'Jul' || month === 'Aug') {
        console.log("Summer");
    } else if((day >= 21 && month === 'Jun') || (day < 22 && month === 'Sept')){      
        console.log("Summer");
    } else if (month === 'Oct' || month === 'Nov') {
        console.log("Autumn");
    } else if ((day >= 22 && month === 'Sept') || (day < 21 && month === 'Dec')) {
        console.log("Autumn");
    } else if (month === 'Oct' || month === 'Nov') {
        console.log("Winter");
    } else if((day >= 21 && month === 'Dec') || (day < 20 && month === 'Mar')){
        console.log("Winter");
    }

【问题讨论】:

  • 我经历了这个,从我所见,接受的解决方案以及其他一些解决方案不包括有关如何在解决方案中实现数字输入的信息。我已经看到有很多更复杂的解决方案,但它们似乎与我想要实现的完全不同:)
  • @GeorgiPopov 如何选择月份?练习是否只是以字符串形式为您提供月份,还是会有一个下拉菜单供您选择月份?
  • 抱歉,我最初应该提供该信息。只是一个字符串形式。
  • OK - 我更新了我的代码,假设月份是一个 3 个字符的字符串,而日期是一个数字。我只是以 MMDD 格式构造一个字符串并像以前一样进行测试。

标签: javascript conditional-statements


【解决方案1】:

还有另一种使用条件的方法也有效(见下文)。非常感谢所有建议!

let month = 'Apr';
let date = 3;

switch (month) {
    case "Mar":
        if (date >= 1 && date <= 19) {
            console.log("Winter");
        } else if (date >= 20 && date <= 31) {
            console.log("Spring");
            break;
        }
    case "Apr":
        if (date >= 1 && date <= 30) {
            console.log("Spring");
            break;
        }
    case "May":
        if (date >= 1 && date <= 31) {
            console.log("Spring");
            break;
        }
    case "Jun":
        if (date >= 1 && date <= 20) {
            console.log("Spring");
        } else if (date >= 21 && date <= 30) {
            console.log("Summer");
            break;
        }
    case "Jul":
        if (date >= 1 && date <= 31) {
            console.log("Summer");
            break;
        }
    case "Aug":
        if (date >= 1 && date <= 31) {
            console.log("Summer");
            break;
        }
    case "Sep":
        if (date >= 1 && date <= 21) {
            console.log("Summer");
        } else if (date >= 22 && date <= 30) {
            console.log("Autumn");
            break;
        }
    case "Oct":
        if (date >= 1 && date <= 31) {
            console.log("Autumn");
            break;
        }
    case "Nov":
        if (date >= 1 && date <= 30) {
            console.log("Autumn");
            break;
        }
    case "Dec":
        if (date >= 1 && date <= 21) {
            console.log("Autumn");
        } else if (date >= 22 && date <= 31) {
            console.log("Winter");
            break;
        }
    case "Jan":
        if (date >= 1 && date <= 31) {
            console.log("Winter");
            break;
        }
    case "Feb":
        if (date >= 1 && date <= 29) {
            console.log("Winter");
            break;
        }
};

【讨论】:

    【解决方案2】:

    如果您可以将日期转换为“MMDD”格式的字符串,您可以这样做:

    var months = ["xxx","Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"];
    
    function getMMDD(mth, dy) {
      return months.indexOf(mth).toString().padStart(2, "0") + dy.toString().padStart(2, "0");
    }  
    
    function findSeason(mth, dy) {
      let d = getMMDD(mth, dy);
      if (d < "0320") {return "Winter";}
      if (d < "0621") {return "Spring";}
      if (d < "0921") {return "Summer";}
      if (d < "1222") {return "Autumn";}
      return "Winter";
    }
    
    console.log(findSeason("Jan", 25));
    console.log(findSeason("Feb", 25));
    console.log(findSeason("Mar", 25));
    console.log(findSeason("Apr", 28));
    console.log(findSeason("May", 25));
    console.log(findSeason("Jun", 25));
    console.log(findSeason("Jul", 25));
    console.log(findSeason("Aug", 25));
    console.log(findSeason("Sep", 25));
    console.log(findSeason("Oct", 25));
    console.log(findSeason("Nov", 25));
    console.log(findSeason("Dec", 25));

    这只是一个简单的字符串比较。第一个匹配的测试返回赛季。如果没有匹配的测试(12 月的最后几天),则返回“Winter”。

    【讨论】:

    • 您不添加// convert to string in "MMDD" format 部分吗?
    • 这将完全取决于如何确定月份和日期部分 - 它们可能已经在 Date 对象中,或者它们可以由用户选择或从 innerHTML 文本字符串派生。 OP 显示的所有内容都是“提供的日期”——这可能意味着许多不同格式中的一种。如果当时知道原始格式,是的,我可以添加一个转换脚本。
    • 就问题询问操作,表示字符串形式。
    【解决方案3】:

    您可以创建一个对象,其中包含每个季节结束的每个季节,然后找到日期大于提供的日期的第一个季节(如果没有找到,则围绕第一季)。

    这样做的问题是您需要将“Dec”和 23 转换为日期对象。一个简单的方法是创建一个包含所有月份的数组,当您需要查找季节时,在该数组上获取月份的索引并像这样使用它new Date(_year_, _index_, _date_)

    var year = new Date().getFullYear();
    var months = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"];
    var seasons = {
      "Winter": new Date(year, 2, 20),
      "Spring": new Date(year, 5, 21),
      "Summer": new Date(year, 8, 22),
      "Autumn": new Date(year, 11, 21)
    };
    
    console.log(getSeason("Jan", 20));
    console.log(getSeason("Feb", 20));
    console.log(getSeason("Mar", 20));
    console.log(getSeason("Apr", 20));
    console.log(getSeason("May", 20));
    console.log(getSeason("Jun", 20));
    console.log(getSeason("Jul", 20));
    console.log(getSeason("Aug", 20));
    console.log(getSeason("Sep", 20));
    console.log(getSeason("Oct", 20));
    console.log(getSeason("Nov", 20));
    console.log(getSeason("Dec", 20));
    console.log(getSeason("Dec", 22));
    
    function getSeason(month, day) {
      var index = months.indexOf(month);
      var newDate = new Date(year, index, day);
      for (var key in seasons) {
        if (newDate < seasons[key]) return key;
      }
      return Object.keys(seasons)[0];
    }

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-08-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-25
      相关资源
      最近更新 更多