2

私は SO から運が良かっただけなので、もう一度試してみませんか?

季節 (春、夏、冬、秋) に基づいて異なる画像を表示する必要があるアプリケーションがあります。これらの季節には、非常に具体的な開始日と終了日があります。

天才の皆さんにお願いしたいのは、GetSeason というメソッドです。このメソッドは、日付を入力として取り、Spring、Summer、Winter、または Fall の文字列値を返します。日付範囲とそれに関連する季節は次のとおりです。

春:3/1~4/30
夏:5/1~8/31
秋:9/1~10/31
冬:11/1~2/28

誰かが適切な季節を返すための作業方法を提供できますか? みんな、ありがとう!

4

11 に答える 11

7

月をチェックするだけでうまくいくようです:

private static final String seasons[] = {
  "Winter", "Winter", "Spring", "Spring", "Summer", "Summer", 
  "Summer", "Summer", "Fall", "Fall", "Winter", "Winter"
};
public String getSeason( Date date ) {
   return seasons[ date.getMonth() ];
}

// As stated above, getMonth() is deprecated, but if you start with a Date, 
// you'd have to convert to Calendar before continuing with new Java, 
// and that's not fast.
于 2008-10-09T22:57:50.727 に答える
3

ここにいくつかの良い答えがありますが、それらは時代遅れです。java.time クラスを使用すると、この作業がはるかに簡単になります。

java.time

Java の初期バージョンにバンドルされていた厄介な古いクラスは、Java 8 以降に組み込まれたjava.timeクラスに取って代わられました。Oracle チュートリアルを参照してください。機能の多くは、 ThreeTen-Backportで Java 6 および 7 にバックポートされ、さらにThreeTenABPで Android に適合されています。

Month

ここで季節が月全体を使用して定義されていることを考えると、便利なenumを利用できます。このような列挙値は、タイプ セーフであり、有効な値が保証されているため、単なる整数値 (1 ~ 12) よりも優れています。Month

EnumSet

AnEnumSetは、列挙値のサブセットを追跡するための高速でコンパクトなメモリの方法です。

EnumSet<Month> spring = EnumSet.of( Month.MARCH , Month.APRIL );
EnumSet<Month> summer = EnumSet.of( Month.MAY , Month.JUNE , Month.JULY , Month.AUGUST );
EnumSet<Month> fall = EnumSet.of( Month.SEPTEMBER , Month.OCTOBER );
EnumSet<Month> winter = EnumSet.of( Month.NOVEMBER , Month.DECEMBER , Month.JANUARY , Month.FEBRUARY );

例として、特定のタイム ゾーンの現在の時刻を取得します。

ZoneId zoneId = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = ZonedDateTime.now( zoneId );

その日時の値を確認してMonthください。

Month month = Month.from( zdt );

EnumSetを呼び出して、特定の月の値を持つ季節を探しcontainsます。

if ( spring.contains( month ) ) {
    …
} else if ( summer.contains( month ) ) {
    …
} else if ( fall.contains( month ) ) {
    …
} else if ( winter.contains( month ) ) {
    …
} else {
    // FIXME: Handle reaching impossible point as error condition.
}

独自の「シーズン」列挙型を定義する

このシーズンのアイデアをコード ベースで使用している場合は、独自の列挙型「シーズン」を定義することをお勧めします。

基本的な列挙型は単純です: public enum Season { SPRING, SUMMER, FALL, WINTER; }. ofしかし、どの月がどの季節に対応するかを検索するための静的メソッドも追加します。

package work.basil.example;

import java.time.Month;

public enum Season {
    SPRING, SUMMER, FALL, WINTER;

    static public Season of ( final Month month ) {
        switch ( month ) {

            // Spring.
            case MARCH:  // Java quirk: An enum switch case label must be the unqualified name of an enum. So cannot use `Month.MARCH` here, only `MARCH`.
                return Season.SPRING;

            case APRIL:
                return Season.SPRING;

            // Summer.
            case MAY:
                return Season.SUMMER;

            case JUNE:
                return Season.SUMMER;

            case JULY:
                return Season.SUMMER;

            case AUGUST:
                return Season.SUMMER;

            // Fall.
            case SEPTEMBER:
                return Season.FALL;

            case OCTOBER:
                return Season.FALL;

            // Winter.
            case NOVEMBER:
                return Season.WINTER;

            case DECEMBER:
                return Season.WINTER;

            case JANUARY:
                return Season.WINTER;

            case FEBRUARY:
                return Season.WINTER;

            default:
                System.out.println ( "ERROR." );  // FIXME: Handle reaching impossible point as error condition.
                return null;
        }
    }

}

または、Java 14のスイッチ式機能 ( JEP 361 ) を使用します。

package work.basil.example;

import java.time.Month;
import java.util.Objects;

public enum Season
{
    SPRING, SUMMER, FALL, WINTER;

    static public Season of ( final Month month )
    {
        Objects.requireNonNull( month , "ERROR - Received null where a `Month` is expected. Message # 0ac03df9-1c5a-4c2d-a22d-14c40e25c58b." );
        return
                switch ( Objects.requireNonNull( month ) )
                        {
                            // Spring.
                            case MARCH , APRIL -> Season.SPRING;

                            // Summer.
                            case MAY , JUNE , JULY , AUGUST -> Season.SUMMER;

                            // Fall.
                            case SEPTEMBER , OCTOBER -> Season.FALL;

                            // Winter.
                            case NOVEMBER , DECEMBER , JANUARY , FEBRUARY -> Season.WINTER;
                        }
                ;
    }
}

その列挙型の使用方法は次のとおりです。

ZoneId zoneId = ZoneId.of ( "America/Montreal" );
ZonedDateTime zdt = ZonedDateTime.now ( zoneId );
Month month = Month.from ( zdt );
Season season = Season.of ( month );

コンソールにダンプします。

System.out.println ( "zdt: " + zdt + " |  month: " + month + " | season: " + season );

zdt: 2016-06-25T18:23:14.695-04:00[アメリカ/モントリオール] | 月: 6 月 | シーズン: 夏

于 2016-06-25T21:53:47.423 に答える
1

i feel patronized, but flattered. so i'll do it.

This checks not only the month, but day of month.

import java.util.*

public String getSeason(Date today, int year){

    // the months are one less because GC is 0-based for the months, but not days.
    // i.e. 0 = January.
    String returnMe = "";

    GregorianCalender dateToday = new GregorianCalender(year, today.get(Calender.MONTH_OF_YEAR), today.get(Calender.DAY_OF_MONTH);
    GregorianCalender springstart = new GregorianCalender(year, 2, 1);
    GregorianCalender springend = new GregorianCalender(year, 3, 30);
    GregorianCalender summerstart = new GregorianCalender(year, 4, 1);
    GregorianCalender summerend = new GregorianCalender(year, 7, 31);
    GregorianCalender fallstart = new GregorianCalender(year, 8, 1);
    GregorianCalender fallend = new GregorianCalender(year, 9, 31);
    GregorianCalender winterstart = new GregorianCalender(year, 10, 1);
    GregorianCalender winterend = new GregorianCalender(year, 1, 28);

    if ((dateToday.after(springstart) && dateToday.before(springend)) || dateToday.equals(springstart) || dateToday.equals(springend)){
        returnMe = "Spring";

    else if ((dateToday.after(summerstart) && dateToday.before(summerend)) || dateToday.equals(summerstart) || dateToday.equals(summerend)){
        returnMe = "Summer";

    else if ((dateToday.after(fallstart) && dateToday.before(fallend)) || dateToday.equals(fallstart) || dateToday.equals(fallend)){
        returnMe = "Fall";

    else if ((dateToday.after(winterstart) && dateToday.before(winterend)) || dateToday.equals(winterstart) || dateToday.equals(winterend)){
        returnMe = "Winter";

    else {
        returnMe = "Invalid";
    }
    return returnMe;
}

I'm sure this is hideous, and can be improved. let me know in the comments.

于 2008-10-09T23:13:56.980 に答える
1
public class lab6project1 {
    public static void main(String[] args) {
        Scanner keyboard = new Scanner(System.in);

        System.out.println("This program reports the season for a given day and month");
        System.out.println("Please enter the month and day as integers with a space between the month and day");

        int month = keyboard.nextInt();
        int day = keyboard.nextInt();


        if ((month == 1) || (month == 2)) {
            System.out.println("The season is Winter");
        } else if ((month == 4) || (month == 5)) {
            System.out.println("The season is Spring");
        } else if ((month == 7) || (month == 8)) {
            System.out.println("The season is Summer");
        } else if ((month == 10) || (month == 11)) {
            System.out.println("The season is Fall");
        } else if ((month == 3) && (day <= 19)) {
            System.out.println("The season is Winter");
        } else if (month == 3) {
            System.out.println("The season is Spring");
        } else if ((month == 6) && (day <= 20)) {
            System.out.println("The season is Spring");
        } else if (month == 6) {
            System.out.println("The season is Summer");
        } else if ((month == 9) && (day <= 20)) {
            System.out.println("The season is Summer");
        } else if (month == 9) {
            System.out.println("The season is Autumn");
        } else if ((month == 12) && (day <= 21)) {
            System.out.println("The season is Autumn");
        } else if (month == 12) {
            System.out.println("The season is Winter");
        }
    }
}
于 2010-11-27T19:34:57.460 に答える
1

まあ、それは次のように簡単かもしれません

String getSeason(int month) {
    switch(month) {
          case 11:
          case 12:
          case 1:
          case 2:
                return "winter";
          case 3:
          case 4:
                return "spring";
          case 5:
          case 6:
          case 7:
          case 8:
                return "summer";
          default:
                return "autumn";
      }
}

私はコメントでより良い解決策にうんざりしています:列挙型:

public static Enum Season {
    WINTER(Arrays.asList(11,12,1,2)),
    SPRING(Arrays.asList(3,4)),
    SUMMER(Arrays.asList(5,6,7,8)),
    AUTUMN(Arrays.asList(9,10));

    Season(List<Integer> months) {
        this.monthlist = months;
    }
    private List<Integer> monthlist;
    public boolean inSeason(int month) {
        return this.monthlist.contains(month);  // if months are 0 based, then insert +1 before the )
    }

    public static Season seasonForMonth(int month) {
        for(Season s: Season.values()) {
            if (s.inSeason(month))
                 return s;
        }
        throw new IllegalArgumentException("Unknown month");
    }
}
于 2008-10-09T22:51:44.313 に答える
1

ハッシュ テーブルまたは列挙型を使用してみてください。日付を何らかの値 (1 月 1 日が 1 など) に変換してから、特定のフィールドのビンを作成できます。または、月で列挙型を実行できます。{1月: 冬、2月: 冬、...7月: 夏など}

于 2014-07-24T05:09:38.597 に答える
0

質問のタイトルは非常に一般的であるため、ほとんどのユーザーは最初に天文の季節を思い浮かべます。質問の詳細な内容はカスタマイズされた日付範囲に限定されていますが、この制限は天文学的なケースを計算できないことが原因である可能性があるため、天文学的なシナリオについてもこの古い質問への回答をあえて投稿します.

そして、ここでのほとんどの回答は、満月のみに基づいています. ここでは、天文上の季節と任意の日付範囲に基づく季節の両方に対応する 2 つの例を示します。

a) 季節への任意の日付範囲のマッピング

ここでは、追加情報、具体的なタイム ゾーンまたはオフセットが必要です。java.util.Dateそうしないと、月と日の組み合わせを使用してインスタント (入力の昔ながらのインスタンスなど) をローカル表現に変換できません。簡単にするために、システムのタイムゾーンを想定しています。

    // your input
    java.util.Date d = new java.util.Date();
    ZoneId tz = ZoneId.systemDefault();

    // extract the relevant month-day
    ZonedDateTime zdt = d.toInstant().atZone(tz);
    MonthDay md = MonthDay.of(zdt.getMonth(), zdt.getDayOfMonth());

    // a definition with day-of-month other than first is possible here
    MonthDay beginOfSpring = MonthDay.of(3, 1);
    MonthDay beginOfSummer = MonthDay.of(5, 1);
    MonthDay beginOfAutumn = MonthDay.of(9, 1);
    MonthDay beginOfWinter = MonthDay.of(11, 1);

    // determine the season
    Season result;

    if (md.isBefore(beginOfSpring)) {
        result = Season.WINTER;
    } else if (md.isBefore(beginOfSummer)) {
        result = Season.SPRING;
    } else if (md.isBefore(beginOfAutumn)) {
        result = Season.SUMMER;
    } else if (md.isBefore(beginOfWinter)) {
        result = Season.FALL;
    } else {
        result = Season.WINTER;
    }

    System.out.println(result);

のような単純なヘルパー列挙型を使用しましたpublic enum Season { SPRING, SUMMER, FALL, WINTER; }

b) 天文シーズン

ここでは、季節が北半球か南半球かという追加情報も必要です。私のライブラリTime4Jは、バージョン v5.2 を使用して、定義済みの列挙型AstronomicalSeasonに基づいて次のソリューションを提供します。

    // your input
    java.util.Date d = new java.util.Date();
    boolean isSouthern = false;

    Moment m = TemporalType.JAVA_UTIL_DATE.translate(d);
    AstronomicalSeason result = AstronomicalSeason.of(m);

    if (isSouthern) { // switch to southern equivalent if necessary
        result = result.onSouthernHemisphere();
    }

    System.out.println(result);
于 2018-12-07T02:37:33.850 に答える
0

シンプルなソリューション

 Calendar calendar = Calendar.getInstance();
 calendar.setTimeInMillis(timeInMills);
 int month = calendar.get(Calendar.MONTH);
 CurrentSeason = month == 11 ? 0 : (month + 1) / 3;
于 2016-09-01T08:45:54.783 に答える
0

この範囲ではすべての季節が完全な月であるため、日付から月を切り替えることができます。

switch (date.getMonth()) {
    case Calendar.JANUARY:
    case Calendar.FEBRUARY:
         return "winter";
    case Calendar.MARCH:
         return "spring";
    //etc
}

最後の定数のデフォルトではなく、12 個の Calendar 定数すべてを使用して切り替え全体を完了することをお勧めします。次に、入力が正しいことを確認できます。たとえば、

default:
 throw new IllegalArgumentException();

最後に。

ユースケースによっては、単純な文字列ではなく、シーズンに Enum を使用することもできます。

Date.getMonth() メソッドは推奨されないことに注意してください。代わりに java.util.Calendar.get(Calendar.MONTH) を使用してください。(calendar.setDate(yourDate) を使用して Date を Calendar に変換するだけです)

于 2008-10-09T22:52:43.687 に答える