Некоторые хорошие ответы здесь, но они устарели. Классы java.time значительно облегчают эту работу.
java.time
Мучительные старые классы, включенные в ранние версии Java, были вытеснены классами java.time , встроенными в Java 8 и более поздние версии. См. Oracle Tutorial . Большая часть функциональности была перенесена в Java 6 & 7 в ThreeTen-Backport и дополнительно адаптирована для Android в ThreeTenABP .
Month
Учитывая, что времена года здесь определяются с использованием целых месяцев, мы можем использовать удобный Month
enum . Такие перечисляемые значения лучше, чем простые целочисленные значения (1-12), потому что они являются типобезопасными и вам гарантированы допустимые значения.
EnumSet
EnumSet
- это быстродействующий и компактный способ отслеживания подмножества значений перечисления.
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 com.example.javatimestuff;
import java.time.Month;
public enum Season {
SPRING, SUMMER, FALL, WINTER;
static public Season of ( 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;
}
}
}
Вот как использовать это перечисление.
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 );
дата: 2016-06-25T18: 23: 14.695-04: 00 [Америка / Монреаль] | месяц: июнь | сезон: лето