首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Java从日期识别季节

使用Java从日期识别季节
EN

Stack Overflow用户
提问于 2008-10-09 22:37:41
回答 11查看 25.1K关注 0票数 2

我已经从SO中得到了好运,所以为什么不再试一次呢?

我有一个应用程序,它需要根据一年的季节(春、夏、冬、秋)显示不同的图像。对于这些季节,我有非常明确的开始和结束日期。

我想从你们这些天才那里得到一个名为GetSeason的方法,它接受日期作为输入,并返回字符串值Spring、Summer、冬季或Fall。以下是日期范围及其关联的季节:

春季:3/1-4/30

夏季:5/1-8/31

秋季:9/1-10/31

冬季: 11/1-2/28

有没有人能提供一种工作方法来返回合适的季节?谢谢大家!

EN

回答 11

Stack Overflow用户

回答已采纳

发布于 2008-10-09 22:57:51

看起来只要检查月份就可以了:

代码语言:javascript
复制
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.
票数 7
EN

Stack Overflow用户

发布于 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是一种用于跟踪枚举值子集的快速执行且内存紧凑的方法。

代码语言:javascript
复制
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 );

例如,我们获取特定时区的当前时刻。

代码语言:javascript
复制
ZoneId zoneId = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = ZonedDateTime.now( zoneId );

询问其Month日期时间值。

代码语言:javascript
复制
Month month = Month.from( zdt );

通过调用contains查找哪个季节EnumSet具有该特定月份的值。

代码语言:javascript
复制
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来查找哪个月份映射到哪个季节。

代码语言:javascript
复制
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)。

代码语言:javascript
复制
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;
                        }
                ;
    }
}

下面是如何使用枚举。

代码语言:javascript
复制
ZoneId zoneId = ZoneId.of ( "America/Montreal" );
ZonedDateTime zdt = ZonedDateTime.now ( zoneId );
Month month = Month.from ( zdt );
Season season = Season.of ( month );

转储到控制台。

代码语言:javascript
复制
System.out.println ( "zdt: " + zdt + " |  month: " + month + " | season: " + season );

zdt: 2016-06-25T18:23:14.695-04:00美国/蒙特利尔|月份:6月|季节:夏季

票数 3
EN

Stack Overflow用户

发布于 2008-10-09 22:51:44

好吧,它可以像这样简单

代码语言:javascript
复制
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";
      }
}

我在评论中被指责为一个更好的解决方案:枚举:

代码语言:javascript
复制
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");
    }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/189468

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档