Как получить первый / последний день неполной недели в Java - PullRequest
1 голос
/ 15 сентября 2011

и спасибо, что читаете меня.

У меня есть небольшая проблема: мне нужно знать первый / последний день недели в месяце и в году, поэтому:

public String getFirstDayOfWeekAndMonth(int year, int month, int week){
   Calendar weekCalendar = Calendar.getInstance();
   weekCalendar.clear();
   weekCalendar.set( Calendar.YEAR, year );
   weekCalendar.set( Calendar.MONTH, month-1); // zero-based
   weekCalendar.set( Calendar.WEEK_OF_YEAR, week );

   return... ?
}

Например, для следующего календаря:

Month    Week     M   T   W   T   F   S   S           FirstDay    LastDay
          1               1   2   3   4   5              1           5
          2       6   7   8   9   10  11  12             6           12
  1       3       13  14  15  16  17  18  19             13          19
          4       20  21  22  23  24  25  26             20          26
          5       27  28  29  30                         27          30

          5                       1   2   3              1           3
          6       4   5   6   7   8   9   10             4           10
  2       7       11  12  13  14  15  16  17             11          17
          8       18  19  20  21  22  23  24             18          24
          9       25  26  27  28                         25          28

          9                       1   2   3              1           3
  3       10      4   5   6   7   8   9   10             4           10
                     ...

У меня проблемы с неделями в 2 месяца (на примере 5 и 9). Не могли бы вы помочь мне, пожалуйста?

Большое спасибо.

Ответы [ 3 ]

1 голос
/ 15 сентября 2011

Я рекомендую использовать блестящую библиотеку Joda-Time для всех ваших потребностей синхронизации (которую я также рекомендую сделать стандартным импортом во всех ваших проектах).

При этом (не очень чистое, но работающее) решение будет таким:

public String getFirstDayOfWeekAndMonth(int year, int month, int week) {
    DateTime firstDayOfMonth = new DateTime(year, month, 1, 0, 0, 0, 1);
    DateTime lastDayOfMonth = new DateTime(year, month, firstDayOfMonth.dayOfMonth().getMaximumValueOverall(), 0, 0, 0, 1);

    // european style (MON - SUN)
    DateTime firstOfWeek = new DateTime(year, 1, 1, 0, 0, 0, 1).plusWeeks(week - 1).withDayOfWeek(1);
    DateTime lastOfWeek = firstOfWeek.withDayOfWeek(7);

    int firstDay;
    int lastDay;
    if(firstOfWeek.isBefore(firstDayOfMonth))
        firstDay = firstDayOfMonth.getDayOfMonth();
    else
        firstDay = firstOfWeek.getDayOfMonth();

    if(lastOfWeek.isAfter(lastDayOfMonth))
        lastDay = lastDayOfMonth.getDayOfMonth();
    else
        lastDay = lastOfWeek.getDayOfMonth();

    String returner = String.format("%d - %d", firstDay, lastDay);

    return returner;
}

Я не совсем понимаю, почему вы хотите вернуть String из вашего метода, но я думаю, у вас есть причина. Я только что принял формат, вы можете изменить его, если хотите.

0 голосов
/ 16 сентября 2011

Итак, я разработал метод, который возвращает первый и последний день в любую другую библиотеку:

private static int getFirstDayOfWeek(int year,int month,int week){
    return getFirstLastDayOfWeek(true,year,month,week);
}

private static int getLastDayOfWeek(int year,int month,int week){
    return getFirstLastDayOfWeek(false,year,month,week);
}

private static int getFirstLastDayOfWeek(boolean first, int year,int month,int week){
    int exit = 0;
    Calendar calendar = Calendar.getInstance();
    calendar.clear();
    calendar.set(Calendar.WEEK_OF_YEAR, week);
    calendar.set(Calendar.YEAR, year);
    calendar.set(Calendar.MONTH, month-1);
    if (!first)
        calendar.add(Calendar.DAY_OF_MONTH, 6);
    // 1st day of the week
    Date date = calendar.getTime();
    // The month and the day of the 1st day of the week
    int theMonth = Integer.valueOf( getInstance().getStrDate(date,"MM") );

    if (theMonth!=month)
        exit = (first?1:new GregorianCalendar(year, month-1, 1).getActualMaximum(Calendar.DAY_OF_MONTH));
    else
        exit = Integer.valueOf( getInstance().getStrDate(date,"d") );
    return exit;
}
0 голосов
/ 15 сентября 2011

Возможно простой логический тест?

Для первого дня недели:

If (resultDate.month < input.month){
     resultDate = firstDayOf(input.month);
}

и для последнего дня недели

If (resultDate.month > input.month){
    resultDate = lastDayOf(input.month);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...