我已经从SO中得到了好运,所以为什么不再试一次呢?
我有一个应用程序,它需要根据一年的季节(春、夏、冬、秋)显示不同的图像。对于这些季节,我有非常明确的开始和结束日期。
我想从你们这些天才那里得到一个名为GetSeason的方法,它接受日期作为输入,并返回字符串值Spring、Summer、冬季或Fall。以下是日期范围及其关联的季节:
春季:3/1-4/30
夏季:5/1-8/31
秋季:9/1-10/31
冬季: 11/1-2/28
有没有人能提供一种工作方法来返回合适的季节?谢谢大家!
发布于 2008-10-09 22:57:51
看起来只要检查月份就可以了:
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.发布于 2016-06-26 05:53:47
这里有一些很好的答案,但它们已经过时了。java.time类使这项工作变得容易得多。
java.time
与Java的最早版本捆绑在一起的麻烦的旧类已经被Java8和更高版本中内置的java.time类所取代。参见Oracle Tutorial。许多功能已经被移植到ThreeTen-Backport中的Java6和7,并在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 );通过调用contains查找哪个季节EnumSet具有该特定月份的值。
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;
}
}
}或者使用Java14的切换表达式特性(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月|季节:夏季
发布于 2008-10-09 22:51:44
好吧,它可以像这样简单
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");
}
}https://stackoverflow.com/questions/189468
复制相似问题