Java: como faço para obter a data de x dia em um mês (por exemplo, terceira segunda-feira em fevereiro de 2012)

Estou um pouco lutando com isso.

Quero configurar meu calendário para, digamos:erceira segunda-feira de fevereiro de 2012. E não encontrei nenhuma maneira de fazer isso usando Java.

Por exemplo, se eu quiser definir meu calendário para o Natal de 2011, posso fazer isso facilmente, desta maneira:

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

Mas estou perdido em como configurá-lo para, digamos, o Memorial Day 2012, que é a última segunda-feira de maio. Este é o meu código, mas obviamente está errado, porque simplesmente não posso assumir que a última segunda-feira de maio será na quarta semana de maio daquele ano:

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);

Alguma sugestão de como posso descobrir programaticamente, em que semana do mês de maio de 2012 (no exemplo acima) é a última segunda-feira? Supondo que eu possa obter essas informações, devo conseguir que meu código acima funcione.

Preciso de algo que funcionaria basicamente para outros exemplos. Algo que poderia dar um dia exato para os mesmos cenários. Exemplos

Que data é:

3ª quinta-feira de maio de 2015 1ª segunda-feira de junho de 2050 4ª terça-feira de dezembro de 2012ª quarta-feira de julho de 20

Eu realmente preciso disso para o meu projeto e tenho certeza de que é simples, mas estou quebrando a cabeça com isso sem nenhum resultado real para mostrar :) E também não consegui encontrar nada na rede.

Added:

Ok, é aqui que eu cheguei na última segunda-feira de um mês:

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);

Mas não tenho certeza de como eu faria, por exemplo, segundos na segunda-feira do mesmo mês, assi

when.set (GregorianCalendar.DAY_OF_WEEK_IN_MONTH, 2);

Alguma sugestão

questionAnswers(8)

yourAnswerToTheQuestion