Java: Как получить дату дня x в месяце (например, третий понедельник февраля 2012 года)

Я немного не справляюсь с этим.

Я хочу установить календарь, скажем: Третий понедельник февраля 2012 года. И я не нашел способа сделать это с помощью Java.

Например, если я хочу установить календарь на Рождество 2011 года, я могу сделать это легко, вот так:

Calendar when = Calendar.getInstance();
when.set (Calendar.MONTH, Calendar.DECEMBER);
when.set (Calendar.DAY_OF_MONTH, 25)
when.set (Calendar.YEAR, 2011);

Но я теряюсь, как установить его, скажем, на День памяти 2012 года, который является последним понедельником мая. Вот мой код, но он явно неправильный, потому что я просто не могу предположить, что последний понедельник мая будет на 4-й неделе мая того года:

Calendar when = Calendar.getInstance ();
when.set (Calendar.DAY_OF_WEEK,Calendar.MONDAY);
when.set (Calendar.MONTH, Calendar.MAY);
when.set (Calendar.WEEK_OF_MONTH, 4)
when.set (Calendar.YEAR, 2012);

Есть предложения, как я могу программно узнать, на какой неделе месяца мая 2012 года (в примере выше) будет последний понедельник? Если предположить, что я смогу получить эту информацию, я должен быть в состоянии заставить мой код выше работать.

Мне нужно что-то, что в принципе будет работать для любых других примеров. Что-то, что могло бы дать точный день для тех же сценариев. Примеры:

Какая дата:

  • 3-й четверг мая 2015
  • 1-й понедельник июня 2050
  • 4-й вторник декабря 2012
  • 2-я среда июля 2000

Мне очень нужно это для моего проекта, и я уверен, что это просто, но я ломаю голову над этим без каких-либо реальных результатов, чтобы показать :) А также не смог ничего найти в сети.


Добавлено:

Хорошо, вот что у меня получилось для последнего понедельника месяца:

when.set (GregorianCalendar.MONTH, GregorianCalendar.MAY);
when.set (GregorianCalendar.DAY_OF_WEEK, Calendar.MONDAY);
when.set (GregorianCalendar.DAY_OF_WEEK_IN_MONTH, -1);
when.set (Calendar.YEAR, 2012);

Но я не уверен, как мне поступить, например, со вторым понедельником того же месяца, вот так?

when.set (GregorianCalendar.DAY_OF_WEEK_IN_MONTH, 2);

Есть предложения?

14
задан Joe Doyle 30 April 2012 в 00:57
поделиться