我想要一个这样的自定义日历:
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,因为它会显示给用户,以便他/她选择交易的日期。
答案 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)
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.
要跟踪一周中的多天,请使用EnumSet
(Set
的实施)或EnumMap
(Map
的实施)。
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 8及更高版本中。这些类取代了旧的麻烦日期时间类,例如java.util.Date
,.Calendar
和&amp; java.text.SimpleDateFormat
。
现在位于Joda-Time的maintenance mode项目建议迁移到java.time。
要了解详情,请参阅Oracle Tutorial。并搜索Stack Overflow以获取许多示例和解释。
大部分java.time功能都被反向移植到Java 6&amp; ThreeTen-Backport中的7,并进一步适应Android中的ThreeTenABP。
ThreeTen-Extra项目使用其他类扩展java.time。该项目是未来可能添加到java.time的试验场。您可以在此处找到一些有用的课程,例如Interval
,YearWeek
,YearQuarter
等。