我需要在Java中实现一个机制,每周交替一个语句,例如。在第一周,它将变量设置为10,在第二周将其设置为15,在第3周将其设置为10。
这应该适合每年。我现在尝试通过获取周数并检查它是否是偶数来进行算验。(date.getWeekNumber() % 2 == 0
)。
问题在于2014年确实只有52周,而2015年和2016年确实有53周。这将导致53%2 = 1并且在接下来的一周1%1 = 1,在我的情况下将设置错误的变量。
有没有人知道如何改善这个?
答案 0 :(得分:3)
您需要知道每年的周数,因此您可以确定您的病情是否在奇数周甚至数周内启用。你不能弄清楚这个年或 last 年是否有一年中的偶数或奇数周,因为它基本上是累积的。
如果您只在有限的日期范围内(例如2000年至2100年)需要此项,那么您只需计算一张表。如果您在很多日期都需要它,您可以建立一个400年的桌子,并充分利用每400年一次的骑行。
更简单的案例示例,使用java.time
API:
例如:
private static final int MIN_YEAR_INCLUSIVE = 2000;
private static final int MAX_YEAR_EXCLUSIVE = 2100;
private static final boolean[] ENABLED_FOR_ODD_WEEKS =
buildTable(MIN_YEAR_INCLUSIVE, MAX_YEAR_EXCLUSIVE);
private static final boolean[] buildTable(int minYear, int maxYear) {
boolean[] table = new boolean[maxYear - minYear];
boolean current = true;
for (int year = minYear; year < maxYear; year++) {
table[year - minYear] = current;
Year accessor = Year.of(year);
int weeksInYear = IsoFields
.WEEK_OF_WEEK_BASED_YEAR
.rangeRefinedBy(accessor)
.getMaximum();
if (weeksInYear == 53) {
current = !current;
}
}
}
public boolean isEnabled(LocalDate date) {
int year = date.getYear();
if (year < MIN_YEAR_INCLUSIVE || year >= MAX_YEAR_EXCLUSIVE) {
throw new IllegalArgumentException("Invalid year: " + year);
}
int weekOfWeekYear = date.get(IsoFields.WEEK_OF_WEEK_BASED_YEAR);
boolean oddWeek = weekOfWeekYear % 2 == 1;
return oddWeek == ENABLED_FOR_ODD_WEEKS[year - MIN_YEAR_INCLUSIVE];
}