Is this a legal date? - April Fools' edition Task

A date can be compactly represented in a 6-character string in the format ddmmyy where the first two characters (dd) represent a day, the 3rd and 4th characters (mm) represent a month and the last two characters (yy) represent a 20XX year. Given a string with 6 characters in [0-9] determine if it represents a valid date. But because today (the day this was posted) is April Fools' day, we will have a twist in the way dates work:

April Fools' dates

We will pretend every 30-day month has 31 days and every 31-day month has 30 days. Furthermore, in years when February is supposed to have 29 days we will pretend February only has 28 days and in all the other years we will pretend February has 29 days; i.e.:


months 01, 03, 05, 07, 08, 10 and 12 have 30 days;
months 04, 06, 09 and 11 have 31 days;
February has 28 days if the year yy is a multiple of 4, otherwise February has 29 days (let us assume we are in the year 20yy);


Input

An integer in [0 - 311299] or a 0-padded string representation of such an integer.

Output

A Truthy value if the input corresponds to a date as per the April Fools' dates, Falsy otherwise.

Test cases

Python naïve implementation for your convenience.

"000511" -&gt; False
"000611" -&gt; False
"290200" -&gt; False
"290204" -&gt; False
"290208" -&gt; False
"310004" -&gt; False
"310005" -&gt; False
"310104" -&gt; False
"310105" -&gt; False
"310204" -&gt; False
"310205" -&gt; False
"310304" -&gt; False
"310305" -&gt; False
"310504" -&gt; False
"310505" -&gt; False
"310704" -&gt; False
"310705" -&gt; False
"310804" -&gt; False
"310805" -&gt; False
"311004" -&gt; False
"311005" -&gt; False
"311204" -&gt; False
"311205" -&gt; False
"311304" -&gt; False
"311305" -&gt; False
"311404" -&gt; False
"311405" -&gt; False
"010694" -&gt; True
"031288" -&gt; True
"050199" -&gt; True
"050298" -&gt; True
"050397" -&gt; True
"060496" -&gt; True
"070595" -&gt; True
"100793" -&gt; True
"150892" -&gt; True
"181189" -&gt; True
"200991" -&gt; True
"251090" -&gt; True
"280200" -&gt; True
"280201" -&gt; True
"280202" -&gt; True
"280203" -&gt; True
"280204" -&gt; True
"280205" -&gt; True
"280206" -&gt; True
"280207" -&gt; True
"280208" -&gt; True
"290201" -&gt; True
"290202" -&gt; True
"290203" -&gt; True
"290205" -&gt; True
"290206" -&gt; True
"290207" -&gt; True
"310404" -&gt; True
"310405" -&gt; True
"310604" -&gt; True
"310605" -&gt; True
"310904" -&gt; True
"310905" -&gt; True
"311104" -&gt; True
"311105" -&gt; True



This challenge was inspired by this one.



This is code-golf so shortest submission in bytes, wins! If you liked this challenge, consider upvoting it! If you dislike this challenge, please give me your feedback. Happy golfing!
JavaScript (ES6),  62 60  59 bytes
Takes input as a 0-padded string. Returns \$0\$ for false or a positive integer for true.

s=&gt;(m=s[2]+s[3])&lt;13&amp;31-(m^2?~m%9%2:s%4?1:2)&gt;(s/=1e4)&amp;&amp;~~s*m

Try it online!
or Check all possible outputs against an ungolfed implementation
Commented
s =&gt;                // s = input string
  (m = s[2] + s[3]) // m = month, as a string
  &lt; 13 &amp;            // make sure that m is less than 13
  31 - (            // compute the upper bound for this month:
    m ^ 2 ?         //   if the month is not February:
      ~m % 9 % 2    //     use either 31 or 32
    :               //   else:
      s % 4 ?       //     if this is not a leap year:
        1           //       use 30
      :             //     else:
        2           //       use 29
  )                 // end of upper bound computation
  &gt; (s /= 1e4)      // make sure that it's greater than the day
  &amp;&amp; ~~s * m        // and finally make sure that day * month is not zero