CJam, 331 318 316 289 290 bytes
-13 bytes by having the weekday function spit out a string which can be compared directly to the natural-language word given.
-2 bytes by removing a -2 offset in weekday calculation.
-27 bytes with an alternate method of converting a month name to a number from 1 to 12.
+1 byte to correct a typo.
l);" and if"4/{/',*}/',/{S/(;}/_0='w#{]:\}&[)\-4={A="bMAanlseovc"#))}:R~]])\{_-2=0="lia"#"3=c'a=W=R:M;W=:O;"6/=~}/:L;[M0]{))+_{[~_2$3<_!-2*@@- 4/_25/_4/\W*](23*9/+:+7%"Fri Satur Sun Mon Tues Wednes Thurs"S/="day"+}:T~\_1=1e2md_4%!\!@4%!*-L=@O=*!}g)@(\@+T_@="Yes"@"No, it will be a "\+?\;'.+
Try it online!
Oh boy. This was a doozy.
Quick write-up:
l); e# Read input, and remove question mark.
" and if"4/{/',*}/',/ e# Replace " and" and " if" with commas, then split into clauses.
{S/(;}/ e# Split each clause into words, and remove the first "word".
e# (It will be "If" or "Will" if they are capitalized, empty otherwise.)
_0='w# e# If "w" is not the last clause's first word's first character...
{]:\}& e# ...the "will" clause is not on top; bring it to the top.
[ e# We will parse its month and weekday, and put them in an array.
) e# Raw weekday string from input.
\-4={A="bMAanlseovc"#))}:R~ e# Month to number by looking up the character "at" index 10.
e# (If month name is less than 11 chars, the index wraps around.)
] e# Now we've collected these into an array.
])\ e# Collect clauses in array and bring to top.
{_-2=0="lia"# e# Use the first character of the second-to-last word in the clause...
"3=c'a=W=R:M;W=:O;"6/ e# ...to index into one of three pieces of 6(-ish)-character code...
=~}/ e# ...to run on each clause to extract the relevant information.
:L; e# Now O has the weekday, M the month, and L the leap-year status.
[M0]{ e# We'll use M to get the first year that matches the criteria.
))+_ e# Increment the year, and put it back in the array.
{[~_2$3<_!-2*@@- 4/_25/_4/\W*](23*9/+:+7%"Fri Satur Sun Mon Tues Wednes Thurs"S/="day"+}:T~ e# Weekday of day 1, given [month year].
e# (Algorithm adapted from http://cadaeic.net/calendar.htm)
\_1=1e2md_4%!\!@4%!*- e# Check if year is leap year.
L=@O=*!}g e# Run this loop until leap-year and weekday criteria match the year.
)@(\@+T e# Get weekday of requested month with calculated year...
_@= e# ...then compare it with requested weekday.
"Yes"@"No, it will be a "\+?\;'.+ e# Choose the right string based on the weekday.
Alternate 290-byter
This works in almost the same way, except it uses a LUT to determine the month offset in the weekday calculation, instead of math.
l);" and if"4/{/',*}/',/{S/(;}/_0='w#{]:\}&[)\-4={A="bMAanlseovc"#}:R~]])\{_-2=0="lia"#"3=c'a=W=R:M;W=:O;"6/=~}/:L;[M0]{))+_{[~_2$1<- 4/_25/_4/\W*](2457931901 7b=+:+7%"Fri Satur Sun Mon Tues Wednes Thurs"S/="day"+}:T~\_1=1e2md_4%!\!@4%!*-L=@O=*!}g)@(\@+T_@="Yes"@"No, it will be a "\+?\;'.+
Try it online!
Random snippets
Some fun little snippets to experiment with on your own:
[~_2$3<_!-2*@@- 4/_25/_4/\W*](23*9/+:+7%
- takes [month year]
on stack, returns weekday with Friday=0 to Thursday=6
1e2md_4%!\!@4%!*-
- takes year
on stack, if result is nonzero then that is a leap year
60b73%W*7,=
- takes capitalized weekday string on stack, returns index into week with Wednesday=0 to Tuesday=6
134b395%7%
- same as above, but with Tuesday=0 to Monday=6
75b501%8%
- same as above, but with Saturday=0 to Friday=6
4b502%9%
- same as above, but with Sunday=0 to Saturday=6
A="bMAanlseovc"#
- takes month
on stack, returns month number with January=-1 to December=10