如何使用 switch 语句在 java 中编写方法来计算给定日期的季节



我已经看到了几个使用 switch 语句的例子,一次有 3 个月的案例,在不同的季节。但是我想使用 switch 语句创建一个方法,其中季节从特定日期开始,例如:


12 月 21 日至 3 月 20 日 = 冬季

3 月 21 日至 6 月 20 日 = 春季

6 月 21 日至 9 月 = 夏季

9 月 21 日至 12 月 20 日 = 秋季


我想使用用户输入的 int 变量来为每个月和日期执行此操作。

请有人告诉我如何做到这一点?请记住,我对编码相当陌生

我当前的代码包括一个检查日期是否有效但仍在进行中的方法:

package seasonclassification;
import java.util.Scanner;
public class SeasonClassification {
public static void main(String[] args) {
    Scanner scan = new Scanner(System.in);
    System.out.println("Enter the month in terms of numbers (e.g March = 3) you wish to check the season of:");
    int calMonth = scan.nextInt();
    System.out.println("Enter the day in terms of numbers (e.g 27th = 27):");
    int calDay = scan.nextInt();
}
public static boolean isValidDate(int month, int day) {
    boolean x;
    if ((month == 1) || (month == 3) || (month == 5) || (month == 7) || (month == 8) || (month == 10) || (month == 12) && (day >= 1) && (day <= 31)) {
        x = true;
    }
    if ((month == 4) || (month == 6) || (month == 9) || (month == 11) && (day >= 1) && (day <= 30)) {
        x = true;
    }
    if ((month == 2) && (day >= 1) && (day <= 29)) {
        x = true;
    } 
    else {
        x = false;
    }
    return x;
}
public static String findSeason(int month, int day) {
    switch (month,day) {
    }
}
}

首先,您过早地进行了优化。其次,它很丑(真的很丑)。但是,您需要一个例子,以便您可以

public static void main(String[] args) {
  java.util.Date[] testDates = new java.util.Date[] {
      new java.util.Date(114, 11, 20),
      new java.util.Date(114, 11, 21),
      new java.util.Date(114, 2, 20),
      new java.util.Date(114, 2, 21),
      new java.util.Date(114, 5, 20),
      new java.util.Date(114, 5, 21),
      new java.util.Date(114, 8, 20),
      new java.util.Date(114, 8, 21) };
  for (java.util.Date d : testDates) {
    System.out.print(d);
    System.out.print(" ");
    System.out.println(getSeasonName(d));
  }
}
private static String getSeasonName(
    java.util.Date date) {
  java.util.Calendar c = java.util.Calendar
      .getInstance();
  c.setTime(date);
  switch (c.get(java.util.Calendar.MONTH)) {
  case java.util.Calendar.MARCH:
    if (c.get(java.util.Calendar.DAY_OF_MONTH) > 20) {
      return "Spring";
    }
    return "Winter";
  case java.util.Calendar.APRIL:
  case java.util.Calendar.MAY:
    return "Spring";
  case java.util.Calendar.JUNE:
    if (c.get(java.util.Calendar.DAY_OF_MONTH) > 20) {
      return "Summer";
    }
    return "Spring";
  case java.util.Calendar.JULY:
  case java.util.Calendar.AUGUST:
    return "Summer";
  case java.util.Calendar.SEPTEMBER:
    if (c.get(java.util.Calendar.DAY_OF_MONTH) > 20) {
      return "Autumn";
    }
    return "Summer";
  case java.util.Calendar.OCTOBER:
  case java.util.Calendar.NOVEMBER:
    return "Autumn";
  case java.util.Calendar.DECEMBER:
    if (c.get(java.util.Calendar.DAY_OF_MONTH) < 21) {
      return "Autumn";
    }
  }
  return "Winter";
}

输出

Sat Dec 20 00:00:00 EST 2014 Autumn
Sun Dec 21 00:00:00 EST 2014 Winter
Thu Mar 20 00:00:00 EDT 2014 Winter
Fri Mar 21 00:00:00 EDT 2014 Spring
Fri Jun 20 00:00:00 EDT 2014 Spring
Sat Jun 21 00:00:00 EDT 2014 Summer
Sat Sep 20 00:00:00 EDT 2014 Summer
Sun Sep 21 00:00:00 EDT 2014 Autumn

您可以在month上使用 switch-statement,然后在一个月可能属于多个季节的情况下使用 if 语句。例如:

public static String findSeason(int month, int day) { 
    switch (month) {
        case 1: // January - Same season; Fall through to next case
        case 2: // February
            return "Winter";
        case 3: // March
            // Season change - check day of month
            return (day <= 20 ? "Winter" : "Spring");
        /* The rest of your cases here */ 

我想可以使用day上的开关代替 if 语句,但同样,它不适合这种情况。您还必须为每月的每一天写大约 30 个左右的案例,这并不有趣,也不是一个优雅的解决方案。

编辑:这是案例3中的三元运算符。你可以在这里阅读它。

在这种情况下,

switch语句不是常用的。

我会使用 Date.compareTo() 函数来检查日期是否在一个范围内(用法解释如下:http://www.mkyong.com/java/how-to-compare-dates-in-java/)

像这样:

SUMMER_START, SUMMER_END = // separate date for start, end of each season
if(date.compareTo(SUMMER_START) > 0 && date.compareTo(SUMMER_END) < 0){
    // date is in summer..
} else if(/* Another season */){
    // date is in this season..
}

请注意,为此,您必须将日期转换为Date对象,可能是这样的(这取决于您的输入......在 Java 中创建日期的正确方法是什么?

最新更新