ここにいくつかの良い答えがありますが、それらは時代遅れです。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 月 | シーズン: 夏