Java 每周交替

Java 每周交替,java,calendar,week-number,alternate,Java,Calendar,Week Number,Alternate,我需要在Java中实现一种机制,它每周交替执行一个语句,例如,在第一周,它将变量设置为10,在第二周,它将变量设置为15,在第三周,它将变量再次设置为10 这应该每年都有效。现在,我尝试通过获取周数并检查它是否为偶数来对此进行验证。(date.getWeekNumber()%2==0) 这里的问题是2014年只有52周,而2015年和2016年只有53周。这将导致53%2=1,在接下来的一周,1%1=1,在我的情况下,这将设置错误的变量 有人知道如何改进这一点吗 您需要知道每年的周数,这样您就可

我需要在Java中实现一种机制,它每周交替执行一个语句,例如,在第一周,它将变量设置为10,在第二周,它将变量设置为15,在第三周,它将变量再次设置为10

这应该每年都有效。现在,我尝试通过获取周数并检查它是否为偶数来对此进行验证。(
date.getWeekNumber()%2==0

这里的问题是2014年只有52周,而2015年和2016年只有53周。这将导致53%2=1,在接下来的一周,1%1=1,在我的情况下,这将设置错误的变量


有人知道如何改进这一点吗

您需要知道每年的周数,这样您就可以确定您的病情是启用奇数周还是偶数周。你不能仅仅计算今年或去年一年中的周数是偶数还是奇数,因为这基本上是累积的

如果您只需要在有限的日期范围内(如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];
}
private static final int MIN_YEAR_include=2000;
专用静态最终整数最大年数不包括=2100;
私有静态最终布尔值[]已启用\u奇数\u周=
构建表(包括最小年份,不包括最大年份);
私有静态最终布尔[]构建表(int minYear,int maxYear){
布尔[]表=新布尔值[maxYear-minYear];
布尔电流=真;
对于(int year=minYear;year=最大年|年除外){
抛出新的IllegalArgumentException(“无效年份:+year”);
}
int weekOfWeekYear=date.get(IsoFields.WEEK\u OF\u WEEK\u BASED\u YEAR);
布尔值oddWeek=weekOfWeekYear%2==1;
return oddWeek==为奇数周启用[year-MIN\u year\u INCLUSIVE];
}

您使用的是哪种日期/时间API?Java内置的Java.util.Calendar好的-如果必须,您应该能够修改我给Java.util.Calendar的代码。如果可能的话,我建议您使用java.time或Joda-time。