在JAVA中创建一个星期几的自定义集合

时间:2016-01-19 08:32:53

标签: java calendar

我想要一个这样的自定义日历:

enum TradingDays {Monday, Tuesday, Wednesday, Thursday, Friday};

然后我需要迭代它并检查特定的枚举元素是否是今天的星期几。问题是JAVA日历与我日历中的星期几不匹配。所以:

Calendar now = Calendar.getInstance();

TradingDays.Monday is not equal to any of now.get(Calendar.DAY_OF_WEEK);

那么我如何从JAVA日历中的相同类型(在本例中为整数值)分配星期一,星期二等等呢?

P.S。我需要像这样的日历TradingDays,因为它会显示给用户,以便他/她选择交易的日期。

4 个答案:

答案 0 :(得分:0)

您可以尝试在枚举中使用构造函数,如下例所示:

    public enum Currency {
    PENNY(1),
    NICKLE(5),
    DIME(10),
    QUARTER(25);

     private final int value;

     private Currency(int value) {
         this.value=value;
     }
}

迭代时你可以像这样使用coin.value:

for(Currency coin: Currency.values()){

        System.out.println(coin+" "+coin.value);
        if(coin.value==1){
            System.out.println("THIS is the PENNY");
        }

    }

哪个输出是:

  

PENNY 1

     

这是PENNY

     

NICKLE 5

     

DIME 10

     

第25季

答案 1 :(得分:0)

使用enum你可以做很多你可能熟悉的事情:

档案TradingDays.java

public enum TradingDays {
    Monday(Calendar.MONDAY),
    Tuesday(Calendar.TUESDAY),
    Wednesday(Calendar.WEDNESDAY),
    Thursday(Calendar.THURSDAY),
    Friday(Calendar.FRIDAY);

    private int calendarValue;

    TradingDays(int calendarValue) {
        this.calendarValue = calendarValue;
    }

    public static TradingDays today() {
        return fromCalendarValue(Calendar.getInstance().get(Calendar.DAY_OF_WEEK));
    }

    public static TradingDays fromCalendarValue(int calendarValue) {
        for(TradingDays td : TradingDays.values()) {
            if(td.calendarValue == calendarValue) {
                return td;
            }
        }
        throw new IllegalArgumentException(calendarValue + " is not a valid TradingDays calendarValue");
        // or simply return null
    }

};

答案 2 :(得分:0)

在枚举中创建一个带有int值的构造函数:

公共课CalendarMain {

enum TradingDays {
Monday(2), Tuesday(3), Wednesday(4), Thursday(5), Friday(6);

private int value;

private TradingDays(int value) {
    this.value = value;
}
};

public static void main(String[] args) {

Calendar now = Calendar.getInstance();

if (now.get(Calendar.DAY_OF_WEEK) == TradingDays.Tuesday.value) {
    // Chose Wednesday as the day to trade
    System.out.println(now.get(Calendar.DAY_OF_WEEK));
    System.out.println(TradingDays.Tuesday.value);
}
}

}

答案 3 :(得分:0)

TL;博士

Set<DayOfWeek> tradingDays = EnumSet.range( DayOfWeek.MONDAY , DayOfWeek.FRIDAY ) ; // Mon, Tue, Wed, Thu, & Fri.
Boolean todayIsTradingDay = tradingDays.contains( LocalDate.now( ZoneId.of( "America/Montreal" ) ).getDayOfWeek() ) ;

详细

此功能内置于Java中。

java.time.DayOfWeek枚举

Java包含java.time.DayOfWeek枚举。

传递此枚举的对象,而不仅仅是整数1-7,以使您的代码更加自我记录,提供类型安全性,并确保一系列有效值。

invoices.printReportForDayOfWeek( DayOfWeek.MONDAY );

周一至周日的编号为1-7,符合ISO 8601标准。

通过致电getDisplayName获取当天的本地化名称。

String output = DayOfWeek.MONDAY.getDisplayName( TextStyle.FULL , Locale.CANADA_FRENCH ) ;  // Or Locale.US, etc.

星期几对象的集合

要跟踪一周中的多天,请使用EnumSetSet的实施)或EnumMapMap的实施)。

Set<DayOfWeek> weekend = EnumSet.of( DayOfWeek.SATURDAY , DayOfWeek.SUNDAY ) ;
…
Boolean todayIsWeekend = weekend.contains( LocalDate.now( ZoneId.of( "America/Montreal" ) ).getDayOfWeek() ) ;

或者在本课题的情况下,特别是工作日的集合。如果定义在应用程序执行期间没有改变,也许定义为静态最终常量。

static final Set<DayOfWeek> tradingDays = EnumSet.of( DayOfWeek.MONDAY , DayOfWeek.TUESDAY , DayOfWeek.WEDNESDAY , DayOfWeek.THURSDAY , DayOfWeek.FRIDAY ) ;

或者通过将EnumSet定义为按顺序定义的一系列枚举对象,使其更短。指定星期一&amp;星期五,让EnumSet填写两者之间的值。使用EnumSet.range

static final Set<DayOfWeek> tradingDays = EnumSet.range( DayOfWeek.MONDAY , DayOfWeek.FRIDAY ) ; // Mon, Tue, Wed, Thu, & Fri.

然后今天测试。请注意,时区对于确定当前日期至关重要。对于任何特定时刻,日期在全球范围内按区域变化。

ZoneId zoneId = ZoneId.of( "America/Montreal" ) ;
LocalDate today = LocalDate.now( zoneId ) ;
DayOfWeek todayDow = today.getDayOfWeek() ;
Boolean todayIsTradingDay = tradingDays.contains( todayDow ).getDayOfWeek() ) ;

关于java.time

java.time框架内置于Java 8及更高版本中。这些类取代了旧的麻烦日期时间类,例如java.util.Date.Calendar和&amp; java.text.SimpleDateFormat

现在位于Joda-Timemaintenance mode项目建议迁移到java.time。

要了解详情,请参阅Oracle Tutorial。并搜索Stack Overflow以获取许多示例和解释。

大部分java.time功能都被反向移植到Java 6&amp; ThreeTen-Backport中的7,并进一步适应Android中的ThreeTenABP

ThreeTen-Extra项目使用其他类扩展java.time。该项目是未来可能添加到java.time的试验场。您可以在此处找到一些有用的课程,例如IntervalYearWeekYearQuarter等。