这里有一些很好的答案,但它们已经过时了。java.time 类使这项工作更容易。
java.time
Java 8 及更高版本中内置的java.time类已取代了与最早版本的 Java 捆绑在一起的麻烦的旧类。请参阅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 的 switch 表达式功能 ( 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[美国/蒙特利尔] | 月份:六月 | 季节:夏季