Java: ¿Cómo obtengo la fecha de x día en un mes (por ejemplo, tercer lunes de febrero de 2012)

Estoy luchando con esto.

Quiero configurar mi calendario para decir: Tercer lunes de febrero de 2012. Y no encontré ninguna forma de hacerlo usando Java.

Por ejemplo, si quisiera configurar mi calendario para la Navidad de 2011, puedo hacerlo fácilmente de esta manera:

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

Pero estoy perdido en cuanto a cómo configurarlo, digamos el Memorial Day 2012, que es el último lunes de mayo. Este es mi código, pero obviamente es incorrecto, porque simplemente no puedo suponer que el último lunes de mayo será en la cuarta semana de mayo de ese año:

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

¿Alguna sugerencia sobre cómo puedo averiguar programáticamente, en qué semana del mes de mayo de 2012 (en el ejemplo anterior) es el último lunes? Suponiendo que pueda obtener esa información, debería poder hacer que mi código anterior funcione.

Necesito algo que básicamente funcione para cualquier otro ejemplo. Algo que podría dar un día exacto para los mismos escenarios. Ejemplos:

Qué fecha es:

3er jueves de mayo de 2015 1er lunes de junio de 2050 Cuarto martes de diciembre de 2012 2do miércoles de julio de 2000

Realmente necesito esto para mi proyecto y estoy seguro de que es simple, pero estoy rompiendo mi cabeza sobre esto sin ningún resultado real para mostrar :) Y tampoco pude encontrar nada en la red.

Adicional

Ok, aquí es donde tengo el último lunes de un mes:

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

Pero no estoy seguro de cómo voy a hacer, por ejemplo, segundos lunes en el mismo mes, de esta manera.

when.set (GregorianCalendar.DAY_OF_WEEK_IN_MONTH, 2);

¿Alguna sugerencia

Respuestas a la pregunta(8)

Su respuesta a la pregunta