每周交替

时间:2015-07-27 05:45:42

标签: java calendar week-number alternate

我需要在Java中实现一个机制,每周交替一个语句,例如。在第一周,它将变量设置为10,在第二周将其设置为15,在第3周将其设置为10。

这应该适合每年。我现在尝试通过获取周数并检查它是否是偶数来进行算验。(date.getWeekNumber() % 2 == 0)。

问题在于2014年确实只有52周,而2015年和2016年确实有53周。这将导致53%2 = 1并且在接下来的一周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];
}