Java-календарь возвращает неправильный месяц недели

Я хочу получить последнюю дату для каждой из X недель, начинающихся с даты Y.

например, дата начала — 12/9/2011, а дата тестирования — 15/9/2011 (это первая неделя, начинающаяся с даты начала).

Используя даты начала и тестирования, я хотел бы получить номер недели (неделя 1, неделя 2, неделя 3 и т. д.). В этом случае 15/9/2011 приходится на неделю 1, а последняя дата недели 1 — 18/9.

Я написал некоторый код Java, чтобы получить последние даты за каждую неделю до 19 недели, начиная с даты начала, но он возвращает неправильную дату.

Как я могу получить правильную дату?

import java.util.Calendar;

public class WeekCalculation {

 public static void main(String [] args) {
    Calendar dateStart = Calendar.getInstance();
    Calendar testDate1 = Calendar.getInstance();
    Calendar testDate2 = Calendar.getInstance();
    Calendar testDate3 = Calendar.getInstance();
    Calendar testDate4 = Calendar.getInstance();
    Calendar testDate5 = Calendar.getInstance();
    Calendar testDate6 = Calendar.getInstance();
    Calendar testDate7 = Calendar.getInstance();
    Calendar testDate8 = Calendar.getInstance();
    Calendar testDate9 = Calendar.getInstance();
    Calendar testDate10 = Calendar.getInstance();
    Calendar testDate11 = Calendar.getInstance();
    Calendar testDate12 = Calendar.getInstance();
    Calendar testDate13= Calendar.getInstance();
    Calendar testDate14 = Calendar.getInstance();
    Calendar testDate15 = Calendar.getInstance();
    Calendar testDate16 = Calendar.getInstance();
    Calendar testDate17 = Calendar.getInstance();
    Calendar testDate18 = Calendar.getInstance();
    Calendar testDate19 = Calendar.getInstance();
    dateStart.set(2011, 8, 12);

    testDate1.set(2011, 8, 15);
    testDate2.set(2011, 8, 20);
    testDate3.set(2011, 9, 1);
    testDate4.set(2011, 9, 7);
    testDate5.set(2011, 9, 13);
    testDate6.set(2011, 9, 20);
    testDate7.set(2011, 9, 29);
    testDate8.set(2011, 10, 4);
    testDate9.set(2011, 10, 12);
    testDate10.set(2011, 10, 17);
    testDate11.set(2011, 10, 25);
    testDate12.set(2011, 11, 2);
    testDate13.set(2011, 11, 8);
    testDate14.set(2011, 11, 17);
    testDate15.set(2011, 11, 20);
    testDate16.set(2011, 11, 27);
    testDate17.set(2012, 0, 7);
    testDate18.set(2012, 0, 13);
    testDate19.set(2012, 0, 20);

    int weekNumber1 = findWeekNumber(dateStart, testDate1);
    int weekNumber2 = findWeekNumber(dateStart, testDate2);
    int weekNumber3 = findWeekNumber(dateStart, testDate3);
    int weekNumber4 = findWeekNumber(dateStart, testDate4);
    int weekNumber5 = findWeekNumber(dateStart, testDate5);
    int weekNumber6 = findWeekNumber(dateStart, testDate6);
    int weekNumber7 = findWeekNumber(dateStart, testDate7);
    int weekNumber8 = findWeekNumber(dateStart, testDate8);
    int weekNumber9 = findWeekNumber(dateStart, testDate9);
    int weekNumber10 = findWeekNumber(dateStart, testDate10);
    int weekNumber11 = findWeekNumber(dateStart, testDate11);
    int weekNumber12 = findWeekNumber(dateStart, testDate12);
    int weekNumber13 = findWeekNumber(dateStart, testDate13);
    int weekNumber14 = findWeekNumber(dateStart, testDate14);
    int weekNumber15 = findWeekNumber(dateStart, testDate15);
    int weekNumber16 = findWeekNumber(dateStart, testDate16);
    int weekNumber17 = findWeekNumber(dateStart, testDate17);
    int weekNumber18 = findWeekNumber(dateStart, testDate18);
    int weekNumber19 = findWeekNumber(dateStart, testDate19);

    findDayLeftInTheWeek(dateStart, weekNumber1, testDate1);
    findDayLeftInTheWeek(dateStart, weekNumber2, testDate2);
    findDayLeftInTheWeek(dateStart, weekNumber3, testDate3);
    findDayLeftInTheWeek(dateStart, weekNumber4, testDate4);
    findDayLeftInTheWeek(dateStart, (weekNumber5), testDate5);
    findDayLeftInTheWeek(dateStart, weekNumber6, testDate6);
    findDayLeftInTheWeek(dateStart, weekNumber7, testDate7);
    findDayLeftInTheWeek(dateStart, weekNumber8, testDate8);
    findDayLeftInTheWeek(dateStart, weekNumber9, testDate9);
    findDayLeftInTheWeek(dateStart, weekNumber10, testDate10);
    findDayLeftInTheWeek(dateStart, (weekNumber11), testDate11);
    findDayLeftInTheWeek(dateStart, weekNumber12, testDate12);
    findDayLeftInTheWeek(dateStart, weekNumber13, testDate13);
    findDayLeftInTheWeek(dateStart, weekNumber14, testDate14);
    findDayLeftInTheWeek(dateStart, weekNumber15, testDate15);
    findDayLeftInTheWeek(dateStart, weekNumber16, testDate16);
    findDayLeftInTheWeek(dateStart, (weekNumber17), testDate17);
    findDayLeftInTheWeek(dateStart, weekNumber18, testDate18);
    findDayLeftInTheWeek(dateStart, weekNumber19, testDate19);
}

public static int findWeekNumber(Calendar startDate, Calendar currentDate) {
    long milliseconds1 = startDate.getTimeInMillis();
    long milliseconds2 = currentDate.getTimeInMillis();
    long diff = milliseconds2 - milliseconds1;;
    long diffDays = diff / (24 * 60 * 60 * 1000);
    return (int)(diffDays/7)+1;
}

public static void findDayLeftInTheWeek(Calendar startDate, int weekNumber, Calendar currentDate) {
    Calendar lastDateOfTheWeek = Calendar.getInstance();
    long milliseconds1 = startDate.getTimeInMillis();
    long oneday = 24*60*60*1000;
    long lastDate = (weekNumber * 7 * 24 * 60 * 60 * 1000)+milliseconds1;
    lastDateOfTheWeek.setTimeInMillis(lastDate-oneday);
    System.out.println("last date of the week "+weekNumber+ " " +lastDateOfTheWeek.get(Calendar.DATE)+"/"+(lastDateOfTheWeek.get(Calendar.MONTH)+1)+"/"+lastDateOfTheWeek.get(Calendar.YEAR));
}
}

person aDee    schedule 02.12.2011    source источник


Ответы (2)


Проблема в том, что вы используете целочисленные переменные для вычисления некоторых чисел, которые могут превышать Integer.MAX_VALUE

Проверьте часть этого кода внутри круглых скобок, вы заметите, что это фактическое значение -1875767296 на неделе 4, поэтому ваша дата уменьшается по мере увеличения номера недели.

long lastDate = (weekNumber * 7 * 24 * 60 * 60 * 1000) + milliseconds1;
person Rangi Lin    schedule 02.12.2011
comment
теперь я вижу, в чем проблема в коде... спасибо за вашу помощь... теперь он возвращает правильную дату... спасибо - person aDee; 02.12.2011

Похоже, вам будет проще сделать это, используя определенные ими константы, поскольку вам не нужна миллисекундная гранулярность. Вы можете попробовать что-то вроде этого:

public static int findWeekNumber(Calendar startDate, Calendar currentDate) {
    int startWeek = startDate.get(Calendar.WEEK_OF_YEAR);
    int endWeek = currentDate.get(Calendar.WEEK_OF_YEAR);
    return endWeek - startWeek;
}

public static void findDayLeftInTheWeek(Calendar startDate, int weekNumber, Calendar currentDate) {
    // Make a copy of currentDate, so that it doesn't get changed.
    Calendar lastDay = Calendar.getInstance();
    lastDay.setTime(currentDate.getTime());

    // Determine the last day of the week. From your example stating that September 18,
    // 2011 was the last day of the week, it looks like you're considering Sunday to be
    // the last day of the week.
    switch(currentDate.get(Calendar.DAY_OF_WEEK)) {
        case Calendar.MONDAY:
            lastDay.add(Calendar.DAY, 6);
            break;
        case Calendar.TUESDAY:
            lastDay.add(Calendar.DAY, 5);
            break;
        case Calendar.WEDNESDAY:
            lastDay.add(Calendar.DAY, 4);
            break;
        case Calendar.THURSDAY:
            lastDay.add(Calendar.DAY, 3);
            break;
        case Calendar.FRIDAY:
            lastDay.add(Calendar.DAY, 2);
            break;
        case Calendar.SATURDAY:
            lastDay.add(Calendar.DAY, 1);
            break;
    }

    // You can format the print appropriately; this is just an example.
    System.out.println("The last day of week " + weekNumber + " is " + lastDay.toString());
}
person Jon Newmuis    schedule 02.12.2011