Having looked around for code that will find the next, say 4th Wednesday, or the next 5th Sunday, I decided to write my own. The problem is that most solutions I found do not handle the 5th Sunday problem correctly.
This is my solution. First the function:
<script type="text/javascript">
<!-- Begin
var monthName = ["January","February","March","April","May","June", "July", "August","September","October","November","December"];
function showDate(dayOfWeek, weekOfMonth)
// dayOfWeek - the days of the week 0-6, where 0="Sunday".
// weekOfMonth - the week of the month = 1-5
{
var df = new Date(); // Found date (starts at first day of this month)
var dt = new Date(); // Today
var de = new Date(); // End of month
var foundIt = 0;
var count = 0; // Just to ensure we don't get any infinite loops!
while (!foundIt && count < 10)
{
// First day of the month
df.setDate(1);
// Last day of month
de.setDate(1); // first day of month
de.setMonth(df.getMonth() + 1); // go to next month
de.setDate(de.getDate() - 1); // and back a day - gives last day of relevant month
// Desired day of week
if (dayOfWeek < df.getDay())
df.setDate(df.getDate() + dayOfWeek - df.getDay() + 7);
else
df.setDate(df.getDate() + dayOfWeek - df.getDay());
// Desired week of month
df.setDate(df.getDate() + (weekOfMonth - 1) * 7);
if (df >= dt)
{
// Date found is after or equal to today
if (df <= de)
{
// Day is less than or equal to end of month, so... Found it!
document.write(df.getDate());
if (df.getDate() == 1)
document.write("st ");
else if (df.getDate() == 2)
document.write("nd ");
else if (df.getDate() == 3)
document.write("rd ");
else
document.write("th ");
document.write(monthName[df.getMonth()]);
foundIt = 1;
}
// else
// Date is after end of this month
// df is already next month - try again
}
else
{
// Date is before today
// Move to next month
df.setMonth(df.getMonth() + 1);
}
count++;
}
}
//-->
</script>
And then a couple of examples of it in use, firstly, showing the 2nd Saturday, and then the 5th Sunday:
<th>2<br><script type="text/javascript">
<!-- Begin
showDate(6, 2);
// End -->
</script></th>
<th>5<br><script type="text/javascript">
<!-- Begin
showDate(0, 5);
// End -->
</script></th