在两个日期之间获得完整的“星期一到星期日”周

时间:2014-09-18 22:47:20

标签: java

让我们看看你是否可以帮助我。我希望在两个日期d1和d2之间获得周数(从星期一开始,在星期日结束)。让我们假设d2早于d1。代码的那部分已经编程并正常工作。我现在的问题是我无法正确编写周程序。这就是我现在所做的:

public static void getFullWeeks(Calendar d1, Calendar d2){
    int Weeks = 0;
    Calendar date2 = d2;
    Calendar addWeek = GregorianCalendar.getInstance();
    addWeek.setTime(date2.getTime());
    addWeek.add(Calendar.DATE, 6);

    while(addWeek.before(d1) || addWeek.equals(d1)){
        if(date2.get(Calendar.DAY_OF_WEEK) == Calendar.MONDAY){
            Weeks++;
        }
        date2.add(Calendar.DATE,1);
    }

    System.out.println(
        "The number of weeks (from monday to sunday) between both dates are: " 
        + Weeks);
}

但输出是" 0周",所以该程序无效。怎么了?我没有遇到错误,而且我无法找到解决此问题的有效方法。

谢谢!

3 个答案:

答案 0 :(得分:2)

在没有外部库的Java 8中,您可以执行以下操作:

*编辑周一开始的一周帐户

// TechTrip - ASSUMPTION d1 is earlier than d2
// leave that for exercise
public static long getFullWeeks(Calendar d1, Calendar d2){
    // In Java the week starts on Sunday from an integral perspective
    //  public final static int SUNDAY = 1;
    // SEQUENTIAL UP TO
    // public final static int SATURDAY = 7;

    // make the starting date relative to the Monday we need to calculate from
    int dayOfStartWeek = d1.get(Calendar.DAY_OF_WEEK);

    // IF we have a partial week we should add an offset that moves the start
    // date UP TO the next Monday to simulate a week starting on Monday
    // eliminating partial weeks from the calculation
    // NOTE THIS METHOD WILL RETURN NEGATIVES IF D1 < D2 after adjusting for 
    // offset
    if (dayOfStartWeek == Calendar.SUNDAY) {
        // add an offset of 1 day because this is a partial week
        d1.add(Calendar.DAY_OF_WEEK, 1);
    } else if (dayOfStartWeek != Calendar.MONDAY){
        // add an offset for the partial week
        // Hence subtract from 9 accounting for shift by 1
        // and start at 1
        // ex if WEDNESDAY we need to add 9-4 (WED Int Val) = 5 days
        d1.add(Calendar.DAY_OF_WEEK, 9 - dayOfStartWeek);
    }

    Instant d1i = Instant.ofEpochMilli(d1.getTimeInMillis());
    Instant d2i = Instant.ofEpochMilli(d2.getTimeInMillis());

    LocalDateTime startDate = LocalDateTime.ofInstant(d1i, ZoneId.systemDefault());
    LocalDateTime endDate = LocalDateTime.ofInstant(d2i, ZoneId.systemDefault());

    return ChronoUnit.WEEKS.between(startDate, endDate);
}

这是主要的:

public static void main(String[] args) {
    Calendar d1 = Calendar.getInstance();
    Calendar d2 = Calendar.getInstance();
    d2.add(Calendar.WEEK_OF_YEAR, 6);
    System.out.println(
            "The number of weeks (from monday to sunday) between both dates are: " 
            + getFullWeeks(d1, d2));
}

如果开始日期是星期一,则输出如下:

两个日期之间的周数(从星期一到星期日)是:6

注意,我没有将日期d2指定给d1,使其成为相同的参考。在这种情况下,你会得到0。

* ChronoUnit采用Temporal,它只是一个日期,时间或偏移量。它们必须属于同一类型。时间可以用加号和减号来操纵。

答案 1 :(得分:1)

在我看来,你犯了几个小错误:

1。)你的输出是0周,因为你的代码中的其他地方你必须使用第一个参数d1调用此方法,而不是第二个参数,而在方法体中,你假设{{1早于d2。使用有意义的参数名称可以轻松避免此类错误。在这种情况下,适当的参数名称例如是d1start

2)如果使用end早于d2的参数执行此方法,则您的方法将陷入无限循环。我认为添加到d1不会更改date2中的日期。

3)您的方法计算从星期二到星期一而不是星期一到星期日的星期数。要解决此问题,请将{7}添加至addWeek而不是6天,或更改while循环以仅检查addWeek是否在addWeek之前,并在星期日增加d1

把所有这些放在一起,我相信这会给你你想要的东西:

weeks

答案 2 :(得分:0)

你的算法错了;你的while循环需要比较你正在修改的同一个Calendar对象,但你不这样做,所以要么你有一个无限循环,要么你立即退出返回值为0,这取决于addDate是否是在d1之前或之后(因为两者都没有变化)。你的代码应该是:

public static void getFullWeeks(Calendar d1, Calendar d2){
    int Weeks = 0;
    Calendar addWeek = GregorianCalendar.getInstance();
    addWeek.setTime(d2.getTime());
    addWeek.add(Calendar.DATE, 6);

    while(addWeek.before(d1) || addWeek.equals(d1)){
        if(addWeek.get(Calendar.DAY_OF_WEEK) == Calendar.MONDAY){
            Weeks++;
        }
        addWeek.add(Calendar.DATE,1);
    }

    System.out.println(
        "The number of weeks (from monday to sunday) between both dates are: " 
        + Weeks);
}