[Question]
  [
# 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](https://tio.run/##ZZRRb5swFIXf@RVXVNOIRCXbQMDRUmkvlfbet7SKSHAKkoHINu1Q1d@eXTv0ttukBI4@m3N9Lsbn2bXjkF0ujTpBZ/ed2xtVaz3vm9qpxK42EUADW@gGl9jdRjytEPQExCYPZCaSbwLA3w08tJ2FZlR2@O5AvagBjmOv4KhHq8CNcFDd8Aw1aPVca/AVfbnuBMPosOpo8HIHGffKo96LHhEXfiKAUW4yA9zX2qpoKamMwiQ4HytPBwceXF17@LHFR6EeGjRGLaq/bB7MtLj86s9a9Wpw4FoFr6ozDZhJKwvq91l3x87p@cNziz4bfOaEazupg5lqM391PYyjTpImzJOrUDyZ4RvkK98npYNJN8COp5ClUKRQplClwBn@xdOHtV/IZCf/brAjt009Qz8OrrVfa4VUGQu@VvlHX1vs6osyviVandy/eS9OWbc/1hazbWEX3QDDFzHbKGaMFZzHaVDroG7gp9ZL2RTa7rmFWdXGTy4YlzJMLpiQ1aIyWQa1ZrlcB1WyQhZBcbaWuVecsVJmQRWsksIrwZiUobgoOJMsjFacV9caGRdVFRZ03w1h68wp1LS2KM7QlAX3oIpFcWKcmCAmiGXEMmI5sZxYQawgtia2JlYSK4lVxCpikpj8YJxycMrBKQenHJxycMrBKQenHJxy8GsO7OGya8HvBWyeqLAVoeVBcVKCVEYqJ1WQWpMqSYUtISQ5S3KW5CzJWZKzJGdJzpKc5eL8FEVu3NvRONzF/qaaZJf8f6D5hKs0XK9fFSr/8X1@BXh6@YFxcikOnMPg1dmfFWfjT7lT/Bi/4eD7Ywy3d/CGk9/j1eUP) for your convenience.
```
"000511" -> False
"000611" -> False
"290200" -> False
"290204" -> False
"290208" -> False
"310004" -> False
"310005" -> False
"310104" -> False
"310105" -> False
"310204" -> False
"310205" -> False
"310304" -> False
"310305" -> False
"310504" -> False
"310505" -> False
"310704" -> False
"310705" -> False
"310804" -> False
"310805" -> False
"311004" -> False
"311005" -> False
"311204" -> False
"311205" -> False
"311304" -> False
"311305" -> False
"311404" -> False
"311405" -> False
"010694" -> True
"031288" -> True
"050199" -> True
"050298" -> True
"050397" -> True
"060496" -> True
"070595" -> True
"100793" -> True
"150892" -> True
"181189" -> True
"200991" -> True
"251090" -> True
"280200" -> True
"280201" -> True
"280202" -> True
"280203" -> True
"280204" -> True
"280205" -> True
"280206" -> True
"280207" -> True
"280208" -> True
"290201" -> True
"290202" -> True
"290203" -> True
"290205" -> True
"290206" -> True
"290207" -> True
"310404" -> True
"310405" -> True
"310604" -> True
"310605" -> True
"310904" -> True
"310905" -> True
"311104" -> True
"311105" -> True
```
This challenge was inspired by [this one](https://codegolf.stackexchange.com/q/200086/75323).
---
This is [code-golf](/questions/tagged/code-golf "show questions tagged '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!
  
[Answer]
# JavaScript (ES6), ~~62 60~~ 59 bytes
Takes input as a 0-padded string. Returns \$0\$ for *false* or a positive integer for *true*.
```
s=>(m=s[2]+s[3])<13&31-(m^2?~m%9%2:s%4?1:2)>(s/=1e4)&&~~s*m
```
[Try it online!](https://tio.run/##jdPfSgJBFAbwe59iEnR3S23O/NmdY60SVBAFPcC2gdhairqxY1366mYSFc130dXCj4@POXtmFpP3iZ8289dNf10/VbtZvvP5KF7lvlDliS90mZyT7mrqx6tHNd6uOtxRQ98xYxqqZBT705wqk3S7260/Xu3OipYQhWhLKS1Ruydmk6WvRNn75hQw7f3/LK0k5j1vmrdK/GbFDrHmLORUGk5DzqRlGzLJlE3A@wNmrEO20rEKWEnJTCFbkizDEkfkwJSalAun1J//ygS/6sAWMeE04bTCaYXTGqc1Thtp0DhGWsQWd1vcneLuFHdnuDvD3Q6nHU4zPgnDkxDeJeFdEsFuItyNd0l4l4R3SXiXZHDagLRy@@sTXvsDE2aFWWM2mC3mFHOGOXyAir/G@TMl43EYj8N4HIYP8MAWp1PMGWb3090qW4NZ3VxNpi9xXPieaMpE5CMxrde@XlaDZf184Fnsk544Ovr8ijwXjRiL6P42EkMRXV/c3F1dRuVgUc/XcfSwiZIk2X0A "JavaScript (Node.js) – Try It Online")
or [Check all possible outputs](https://tio.run/##VU/LbsIwELzzFUMkUruYEDu05WW4cewlR0SlNHGACifIDqWogl@nCxKHHnZ3drSj2fnKvjOfu@2@6VV1Ya6lvno9Y1b7pVp1/TJZ8alMwkT2mP1Q84vtjDpq7DuDuRwrPmO@r6UZ8DC8XPyzvS6g4aFn@G0BS4FCwAqcVkT3WRTxR/Uj82Ny5nlksz17P9hP4/iENM40B1fBYoYYYUhgqiHVDRYPrrhxzEJrKMxxQgcDmmqEMdSQWmWOSE3DllIgEXgReBMYCsiYSq14tMk8s5w0SUzniSTrc6tV1o5V9Gk8QXWzSKRUoxEt3S6/B6JkqKKmThu3rdaMR/usSJvMNexV4Cl@uifYlqzdLika2hoLmqRFXle@3ploV69ZsMi2O1OA7BCgC88naDauPiIwztUumOBM7/yTpIc8N963A379Aw) against an ungolfed implementation
### Commented
```
s =>                // s = input string
  (m = s[2] + s[3]) // m = month, as a string
  < 13 &            // 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
  > (s /= 1e4)      // make sure that it's greater than the day
  && ~~s * m        // and finally make sure that day * month is not zero
```
[Answer]
# [Python 3.8](https://docs.python.org/3.8/), ~~77~~ ~~67~~ ~~65~~ ~~62~~ 61 bytes
*-2 bytes thanks to @Bubbler*  
*-3 bytes thanks to @xnor*  
*-1 byte thanks to @PoonLevi's mod by float trick*
```
lambda s:13>(m:=s//100%100)>0<s//1e4<30-[s%4<1,m%-1.76][m!=2]
```
[Try it online!](https://tio.run/##ZdPBjtowEIDhe57CtYQWpMB67NixEeHYJ@iNcmAhqJFIsOIgdVX12akT1NaZOSCRLz92xgr@c/hx75T1/fNafX/eTu3H5cTCFtR@2W6r8P4OQiziZ7UXu/GqLnZKrA9hUewgbxdr2JTmeGi/VPL4bFp/7wcWPkOW@b7phiVvOv8YGFvv2f0xxK@H@qevz0N9OfJVdr337NZ0NWu68UebMFyabpsxFnJ2ZhVrT34Zhj563/h8SjfB35q47rgiX63GNobhlSzf@NtIr73jInysclZ3l4rzv/F07392jRc5u/LDr/Pv@FBPLoTQANMOX0@3UGejmLlIJ6QQRAoiNhUVz3HeTKKRAGmANJI0kjSKNIo0mjSaNCVpStJY0ljcAJkdyOxA5gIyF5C5gMwFBWmKeRPP1LhX861/jKBAWpuCFuDcHKRDhXJlCkYUzqQQT8rpBOLIpVMpaGGdTMEC2HTb@KI5ByloEE6kYP@9jQkABolBYSgwaAwGQ4khPaDpLwAYJAaFQWMwGNJt48tWzB59Aj0HgwuDC4cLhwoAVAAkxR8 "Python 3.8 (pre-release) – Try It Online")
**Input**: Date as an integer.  
**Output**: `True` or `False` if the date is valid or invalid respectively.
**How**:
Overall approach: return `13 > m > 0 < d < max_date_of_month` where `d, m` are date and month respectively.  
The max date of month `m` is calculated as:
* If `m==2`: `30-(s%4<1)` evaluates to `29` if the year is divisible by 4, and `30` otherwise. Since the year is the last 2 digits of the input, input mod 4 is the same as the year mod 4.
* If `m!=2`: `30-m%-1.76` evaluates to `31.xxx` or `30.xxx`
---
### Old solution
### [Python 3.8](https://docs.python.org/3.8/), ~~86~~ ~~83~~ 71 bytes
```
lambda s:13>(m:=s//100%100)>0<s//1e4<29+[s%4>0,([3,2]*7)[m+m//8]][m!=2]
```
[Try it online!](https://tio.run/##ZdPRbpswFIDhe57Cs1QVVtr42BjsqORyT7A7ykWWEA0pEISJtKrqs6eGaJs55yJS@PhjcywyvE@/L70yw3g7lW@38777ddwztwW1i7tt6TYbEOLBf5KdeJ2vmuxV2qfKPWQ7kcaVSmX9vUiq7qnbbExdV923Uta3thsu48Tcu4uiYWz7KeZtP1wnxp537HKd/Neq@TM0h6k51jyJTpeRndu@YW0//@jFTce230aMuZQdWMm6/RC7afQ@tkO6pC9uOLd@3XlFniRz60N3T@JH/jjTfW@/CJ@rlDX9seT8b7zc@5@d/EXKTrz6OHz6h7pxIYQGWHb4sT@7JpolX4u0QgpBJCNiQlH@RNfNIhoJkAZII0kjSaNIo0ijSaNJU5CmII0hjcENkNmBzA5kLiBzAZkLyFyQkSZbN/5Mc3tvfo7XGRRIY0LQAqxdg7SoULYIIReZzUPwJ2V1AH7kwqoQtDBWhmAATLitf9GshRA0CCtCMP/exgAAg8SgMGQYNIYcQ4EhPKDlLwAYJAaFQWPIMYTb@pctWz36AnoNOS5yXFhcWFQAoAIgKL4A "Python 3.8 (pre-release) – Try It Online")
**Input**: Date as an integer.  
**Output**: `True` or `False` if the date is valid or invalid respectively.
**How**: `([3,2]*7)[m+m//8]` first creates a list storing the `max_date + 1` for each month (except February) by repeating `[3, 2]` a few times. If the month is August or after, the pattern switches, so we add 1 to the index.
[Answer]
# [Retina 0.8.2](https://github.com/m-ender/retina/wiki/The-Language/a950ad7d925ec9316e3e2fb2cf5d49fd15d23e3d/a950ad7d925ec9316e3e2fb2cf5d49fd15d23e3d), ~~96~~ ~~93~~ ~~91~~ 81 bytes
```
^(?!(..)?00|..[2-9]|..1[3-9]|31(?!0[469]|11)|3002|2902([02468][048]|[13579][26]))
```
[Try it online!](https://tio.run/##RZG7TsUwEER7/wUFUlIQzaxfu9Ut@QgrCAoKGgpEmX@/2AwS1fFRMtaR/PX@/fH5dn/cnl/vL9vtYTuO/QZcxzHsKc5JjrwOmfMrRmnzTO5XBuyygG0DVpqfA8XPazDXHuewdu77/Q6gkmmiTXDyH6hgxIKFL@ToCQ0lWkJHjZpAtChr0CMnVnhYMiCCySoRSHTS5y2Z5p7yursIdYEyykxmsizLsiIrsiqrsiZrsi7rMpe5LGTxa1QL1UK1UC1UC9VCtVAtVAtXi/nMhUDBhCwU4e/PJnTB03qhNQ/NQ/PQPDQPzUPz0HzBfwA "Retina 0.8.2 – Try It Online") Link includes test cases. Edit: Saved 3 bytes thanks to @mathjunkie. Saved 2 bytes thanks to @ThomasAyoub. Saved a further 10 bytes thanks to @ThomasAyoub for noting that the day cannot be greater than 31. Explanation:
```
^
```
Match only at the beginning of the string.
```
(?!...)
```
Invert the condition so we're now looking for invalid dates. The invalidity conditions (separated by `|` in the original code) are as follows:
```
(..)?00
```
Either the day or month are zero.
```
..[2-9]
```
The month is 20 or higher.
```
..1[3-9]
```
The month is between 13 and 19.
```
31(?!0[469]|11)
```
The day is 31 and the month is not 4, 6, 9 or 11.
```
3002
```
February 30th.
```
2902([02468][048]|[13579][26])
```
February 29th on a leap year.
[Answer]
# [Jelly](https://github.com/DennisMitchell/jelly), 28 [bytes](https://github.com/DennisMitchell/jelly/wiki/Code-page)
```
Ɠ⁽¿ÇB31_+2¦4ḍ~ƊR;€"J$ḅ³Fċ:³$
```
A full program accepting a single integer from STDIN which prints a `1` or `0` to STDOUT.
**[Try it online!](https://tio.run/##ATsAxP9qZWxsef//xpPigb3Cv8OHQjMxXysywqY04biNfsaKUjvigqwiSiThuIXCs0bEizrCsyT//zI5MDIwNw "Jelly – Try It Online")** Or see the [test-suite](https://tio.run/##LZA9ToMxEER7HwOlo9lZ/@1CR0FByQWoaFAuQIMEAiEFUXEDCiq6NKFAkQzKPb5c5MPOUNjPT7J2NXNzvVzezvPubX//3bY/z2cRV8faPtK0eb3brS5P9w@fRxeLafPU1ue/LydtvZjb@/T1uEDbzhkIpR91UREiERYiRLodkAdAA01pSou0SMu0TKu0SjOaHQzcAG4AZ4IzwZngTCRa6gYpPkTNQha491t9vKPXUCR5CX2bj59SPQZkMdcAA8xDj@reQ2eI99DG7AMglIhEIjJRiEoYy/pvUIlIZKIQdYRmBklsotAKzWnOtOy6I/8B "Jelly – Try It Online").
### How?
```
Ɠ⁽¿ÇB31_+2¦4ḍ~ƊR;€"J$ḅ³Fċ:³$ - Main Link
Ɠ                            - set the chain's left argument, N, to evaluated STDIN
 ⁽¿Ç                         - base 250 integer = 3765
    B                        - to binary     = [1, 1, 1, 0, 1, 0, 1, 1, 0, 1, 0, 1]
     31_                     - 31 minus      = [30,30,30,31,30,31,30,30,31,30,31,30]
              Ɗ              - last three links as a monad - f(N):
           4ḍ                -   four divides (N)?
             ~               -   bitwise NOT (0 becomes -1 and 1 becomes -2)
          ¦                  - sparse application...
         2                   - ...to indices: [2]
        +                    - ...action: add
                               i.e. x=9 or 8: [30,2x,30,31,30,31,30,30,31,30,31,30]
               R             - range (vectorises) = [[1,2,...30],...]
                    $        - last two links as a monad - f(that):
                   J         -   range of length = [1,2,...,12]
                  "          -   zip with:
                ;€           -     concatenate each -> [[[1,1],[2,1],...,[30,1]],...]
                     ḅ       - convert from base (vectroises):
                      ³      -   100               -> [[101,201,...,3001],...]
                       F     - flatten
                        ċ    - count occurrences of:
                           $ -   last two links as a monad - f(N):
                         :   -     (N) integer divide:
                          ³  -       100
```
[Answer]
# [05AB1E](https://github.com/Adriandmen/05AB1E/wiki/Commands), 34 [bytes](https://github.com/Adriandmen/05AB1E/wiki/Codepage)
```
2ô¨Ðθ©13‹sĀPr`2QiI4Ö≠ë®7(%ÉÌ}29+‹P
```
Just an initial answer. Can definitely be golfed by a few bytes.  
Inspired by both [*@Arnauld*'s JavaScript answer](https://codegolf.stackexchange.com/a/202893/52210) and [*@SurculoseSputum*'s Python answer](https://codegolf.stackexchange.com/a/202915/52210), so make sure to upvote them!!
[Try it online](https://tio.run/##AUAAv/9vc2FiaWX//zLDtMKow5AxM@KAuXPEgMKrUHNgw5AyUWlJNMOW4omgPsOrOSXDiX0zMc6x4oC5UP//MDEwNjk0) or [verify all test cases](https://tio.run/##PZG9SgNREIVfJSwIiilm5v5OlVeItQoqWKQSDAS2EFIJAQuxsLZUBCsLbfda@xD7Iuud3Ry7j487nLlnbtaXV6vrYdMumll//zRrFu0g5bN7LY@/X90bu377vf7ZLm8v5GTV@vLc717Ke/eRDg/KrjzciR7XF8thfnQ2nDZEFJibuUEcQZSECOABuYLj@soDwgQMwzACIzAOxsEEmACTYBJMhsl7w0hnpDOyGFmMLEYWexg/mrpoVDPkWLL9qy7BqhOI7o3TZBDJazSoa6mN1@ykziBQVjHIzNnGa2@qY4eBSccOM8o0YIAAHMADAiACEiDjFv9nEoADBEAEpKlDlEAe9UaYCKMwiupwXLbjnv8B).
**Explanation:**
```
2ô             # Split the (implicit) input in parts of size 2: ddmmyy → [dd,mm,yy]
  ¨            # Remove the last item (the year): [dd,mm]
   Ð           # Triplicate this
               #  STACK: [[dd,mm],[dd,mm],[dd,mm]]
    θ          # Pop and push the last item
               #  STACK: [[dd,mm],[dd,mm],mm]
     ©         # Store the month in variable `®` (without popping)
      13‹      # Check that it's smaller than 13
               #  STACK: [[dd,mm],[dd,mm],mm<13]
   s           # Swap to get the triplicate value again
               #  STACK: [[dd,mm],mm<13,[dd,mm]]
    ĀP         # Check for both that they're not 0
               #  STACK: [[dd,mm],mm<13,(dd!=0)*(mm!=0)]
   r           # Reverse the stack
               #  STACK: [(dd>0)*(mm>0),mm<13,[dd,mm]]
    `          # Push both values separately to the stack
               #  STACK: [(dd>0)*(mm>0),mm<13,dd,mm]
     2Qi       # If the month is 2:
        I4Ö≠   #  Check that the input is NOT divisible by 4
               #   STACK: [(dd>0)*(mm>0),mm<13,dd,input%4>0]
       ë       # Else:
        ®7(%É  #  Check that the month (from variable `®`) modulo -7 is odd
               #   STACK: [(dd>0)*(mm>0),mm<13,dd,mm%-7%2>0]
             Ì #  And increase this by 2
               #   STACK: [(dd>0)*(mm>0),mm<13,dd,(mm%-7%2>0)+2]
       }29+    # After the if-else: add 29 to this value
               #  STACK: [(dd>0)*(mm>0),mm<13,dd,(input%4>0)+29] if mm == 2
               #  STACK: [(dd>0)*(mm>0),mm<13,dd,(mm%-7%2>0)+31] if mm != 2
           ‹   # Check that the dd is smaller than this value
               #  STACK: [(dd>0)*(mm>0),mm<13,dd<(input%4>0)+29] if mm == 2
               #  STACK: [(dd>0)*(mm>0),mm<13,dd<(mm%-7%2>0)+31] if mm != 2
            P  # And take the product of the stack to check if all are truthy
               #  STACK: [(dd>0)*(mm>0)*(mm<13)*(dd<(input%4>0)+29)] if mm == 2
               #  STACK: [(dd>0)*(mm>0)*(mm<13)*(dd<(mm%-7%2>0)+31)] if mm != 2
               # (after which this is output implicitly as result)
```
[Answer]
# [Python 3.8](https://docs.python.org/3.8/), ~~136~~ \$\cdots\$~~93~~ 78 bytes
Takes the date as an integer and returns Truthy or Falsy.
```
lambda s,h=100:13>(m:=s//h%h)>0<s//h//h<(30-(s%4<1),31+(m in(4,6,9,11)))[m!=2]
```
[Try it online!](https://tio.run/##hZRPb@IwEMXv@RRepApbm6oz/hcPIhz7CXpre2B3QVQqFCXhUCE@O01ou8J5h0o5WD@/vHkej7x/7zZvO5f2zXldP51fl9s//5aqLTc1E83YLfR2Vrd3d5ubjVnQfFj131w7utXtjZ@zKR3/1lv1stO@jKWUzMaYx@2v2j6fu1XbtapWutATIgrMk1LdL1/blSk/URyhvir9jCgQi/TooTn8J1bSiDipMhLJS8xIRUFCRpii@GvSl6/EZSRQEntNLJEIZyQwCWV/JeaUZ3ZsU5bZDWf12VEvKIwRo4pRZVFlUeVQ5VDlyY@SegojEtApoFMEpwhOFTpV6JRQlVAlUE/G9Ri7zth15rETMzhhzxl7zthzxp6zR5UfqWzqrzSbswthIBaIA@KBBCARSAUkm2krXwmvQgtEFIgoEFFgoC8ogCgCqYCkKyNTNPVx2J6pw/TpYCt206/db@L/Tk/F@q1RXbnq3zp1edlmhRpet7V@2XW6M6ZQ@2ZYrifH7qRuF@rYntSxeWzrevV8mpjzBw "Python 3.8 (pre-release) – Try It Online")
[Answer]
# [Perl 5](https://www.perl.org/) `Mbigint -p`, ~~76~~ 75 bytes
```
/(..)(..)/;$_=$1>0&&$1<substr 113130-($_%4?0:1).31323132313132313231,2*$2,2
```
[Try it online!](https://tio.run/##ZZNbS8NAEIXf/RUlREklaWb2kuwYLwhSEBQEfbOltBCkUGptUtA/b9zWKpuZhyWbb8@eOZnsburtynbxtm52q/YqHr9mOK2afHKX529VvFxvdp7Oqi5PRqPhfuRVPLuK8RrOzmK8bHaLpt0OEDVqyJJ4dmpu4AKHI/@ujuN/lqrzWKWqq5r5V5Rlk/Wv/6Q9lveT/VhM2ihNxrf3D@nT7fPz8PW4PKg/kvF81dRp8rLd1cNPrfzabDpNo4uo6iKwgETRILse7NdP9kCR6wNNZQgKMFSEoARLNgQIBZkAIEBJOgQWHKkAKAAiDIFFIAi3OETXS6pRuTCp9mXgt@zhk4/EMoJCg0KjhEYJjRYaLTQGTD@gAdsHVrhY4VJwl4K7lMKlFC5OaJzQEK9ErBKKDqPoMCJzQeQuor8o@ouivyj6i0ZoTF@jnP9z4TE6AORAcaA5MBxYDgoOSg7Cw6roP9hfVOLJiCcjnoz4ST0QyyUFByUHLjTxl6ZHvt837fJ93XTZox352@Kfi@Xbct122WbVZfMf "Perl 5 – Try It Online")
[Answer]
# [Java (JDK)](http://jdk.java.net/), 74 bytes
```
n->{int m=n/100%100;return(m==2?n%4<1?2:1:~m%9%2)<31-(n/=1e4)&13>m&n*m>0;}
```
[Try it online!](https://tio.run/##LZLBbqMwEIbvfQqrEhVUhHpsDDgp6XkPK63UY9UDm0BFNpgITKVVlH317AA/kv3pG@EZe@xT9V1tTsc/97a79IMXJ/Zk8u05aSZ38G3vkufdZfp9bg/icK7GUfysWndFZPSVZ3z37VF0HA/f/dC6r4/Pavgao@sP538N9bE9VL4WTXl3m/21dV50pXshKQMeu6H20@DCrizVmwvSV3pTW9r@6wIbqOhV0yZ0LyXVafREet89ueduL3e3@@5B8MfJPj59PfqxvBqiOOOhrFRSrkhjsbCIheZisy80CwlOcAVXcA3XcAM38Byewwt4sTqhHqEeIT8hPyE/IT@l8HR2QTKz7BxQBe9fGEnWLlR2dW1zZiZTmzF5F5bXcbXcaqaRhVXMgqjgddwTa4lpSFrJLJY2rSRQgRpMQQNmYA4W6C@BCtSgATMwX/qDc8oUfcvgGdzCLfqCe2IacVsvvukHEc5Pab787TKP0fvf0ddd0k8@ufAz9E34GMjsuBXBGLjHeP4pbpIZ4TxF0Zzr9nC7/wc "Java (JDK) – Try It Online")
## Credits
* -1 byte thanks to [ceilingcat](https://codegolf.stackexchange.com/users/52904/ceilingcat)
* -3 bytes thanks to [Kevin Cruijssen](https://codegolf.stackexchange.com/users/52210/kevin-cruijssen)
[Answer]
# [C (gcc)](https://gcc.gnu.org/), ~~95~~ \$\cdots\$ ~~71~~ 65 bytes
Saved ~~3~~ 4 bytes thanks to [ceilingcat](https://codegolf.stackexchange.com/users/52904/ceilingcat)!!!  
Saved a whopping 15 bytes thanks to [Olivier Grégoire](https://codegolf.stackexchange.com/users/16236/olivier-gr%c3%a9goire)!!!  
Saved 6 bytes thanks to [Arnauld](https://codegolf.stackexchange.com/users/58563/arnauld)!!! 
Takes the date as an integer and returns \$0\$ or \$1\$.
```
m;f(s){m=s/100%100;s=m<13&(m-2?~m%9%2-1:s%4<1)+(s/=1e4)<30&&s*m;}
```
[Try it online!](https://tio.run/##jZPNboMwEITveQorEhFuQPEaDN4C7YO0OVT5qTiQRHEOVaP01dOFTKtUVX8kw/jD6/HYMov0ebE4n7tqHQd97JowI2MiearQdDVlk7hL7f1bF3FkU7oNUV6TnsZh1tAq13VmJpNw01Wnc/fUbmJ9HLWbgzqswiE8zFWjjo4oUUX/Ek9zrc4Qcy@WfS8Zl1Jpci4SVRrHri8tOB9mlJyJOuPZJsoawywO1pFhI989kRerjKz3vcgKOdQNSmACW7AFZ@AMnINzsAM7cAEuwCW4BHuwBzOYL0zIR8hHyEfIR8hHyEfIR8hHyEdDPutlHwZKUAvNoDn0o76AllA5N8vwYfgwfBg@DB@GD8OH4dOrP1Wj4Q6sXnaXGyCOn43@0cwP7Xr0e@Xvo3@ubn7q99tZb/dxv6VWtmMqkVqF9nW1XcfDRdczkNToSk2nrR6p3V5oHY@jpUrvlLzjaKkfN@MEP0c7TxTmS19/AdU0w/FJtxqdzu8 "C (gcc) – Try It Online")
[Answer]
# [Bash](https://www.gnu.org/software/bash/) + GNU utilities, ~~86~~ ~~85~~ ~~83~~ 82 bytes
```
a=0424343443434;fold -2|xargs|(read d m y;date -d${a:${m#0}:1}/$d/0$[!(${y#0}%4)])
```
[Try it online!](https://tio.run/##XZFdb9owFIbv8yveQYZAaotPvohb0V3ttqp2h7pKdbFLokGCklBApb@d2Q5nk6pI0ZMnjt/jN6@qLc5D/DJKw6hlgc60Hcpqu@ugKo2uMFjWTWPabV3pslpBm7ZsjEa96@yimyAI9kW5NmjcFgccA0DX9gaYZVFjEB4GOOG3N8A4CGzarvIbb5t61agN6v7xf/TNWc1FEiWxvfzt7q1ea1xHp4NqVu1p7MM0NjjeadUZXOvwQ92GH5uh@Lylz2mopyJ8@jYOP47WfE8mz5NzP8AEo3tMtXmfVrv12k3z2JRV92UAhIcrr/pTIvxx5etYTB/wqlp3/Ar7wtglDR9F75b/asFGdcvCtP7d18aG@OmaXpeVQVvUO3syY/fel10BhQXKN5h30xy7wvVdttjXzR@Ltuv@DFws5vd2Mrw8ITxi7vAZo1H/eoHTqaeHl4H/J5UJzkKIlAgUWMg8RFJEQjAkDLmFmOyqhCHtgdgQm4hNxCZmE7NJ2aRsZmxmbHI2@cUQpxOnE2cRZxFnEWdRwibxxg6ayQQiEDFFee4gFSRlD5G8mFjOHGQikZkDO5ZMLdjsmYwdpCKXkYOcKHef296kJAcpCSkc5L7MCxBDxBAzJAwpQ8YwY3CD@X9BDBFDzJAyZAzuc9th4iM8pD1kbDI2ko28GKKLIfLmLw "Bash – Try It Online")
Input is on stdin.
Output is the exit code: `0` for truthy, `1` for falsey.
---
I thought I'd do a solution based on a date built-in, since I don't think anyone else has done that yet.
This program takes the input string \$x\$ and computes another string \$y\$ with the property that \$x\$ is a valid "April Fools date" iff \$y\$ is a valid normal date. So GNU date applied to \$y\$ will give the desired answer.
[Answer]
# [Swift](https://swift.org) ~~279~~ ~~277~~ ~~272~~ ~~264~~ ~~262~~ ~~257~~ ~~256~~ ~~254~~ 252 bytes
```
func v(s:String)->Int{let m=Int(s.suffix(4).prefix(2))!;switch m{case 0,13...:return 0;case _:switch Int(s.prefix(2))!{case 1...28:return 1;case 29,30:return Int(s.suffix(4))!%4==0&&m==2 ?0:1;case 31:return[4,6,9,11].contains(m) ?1:0;case _:return 0}}}
```
My first and most probably failed attempt at code golf. Please be nice!
Here is a more readable version:
```
func validDate(s :String) -> Int {
    let mm = Int(s.suffix(4).prefix(2))!
    switch mm {
    case 0,13...:
        return 0
    case _:
    switch Int(s.prefix(2))! {
    case 1...28:
        return 1
    case 29, 30:
        return Int(s.suffix(4))! % 4 == 0 && mm == 2 ? 0: 1
    case 31:
        return[4,6,9,11].contains(mm) ? 1:0
    case _:
        return 0
    }
  }
}
```
Any constructive feedback is welcome, negative feedback not so welcome. 
Link to project with swift tests on
[Github](https://github.com/johannwerner/AprilFoolsGolfChallenge)
**Updated solution** 
to make it work for console input
# ~~288~~ ~~251~~ 249 bytes
```
let s=readLine()!;let m=Int(s.suffix(4).prefix(2))!;let d=Int(s.prefix(2))!;if m<0||m>13{print(0)};if(1...28).contains(d){print(1)}else if d==29||d==30{print(!(Int(s.suffix(4))!%4==0&&m==2))}else if d==31{print([4,6,9,11].contains(m))}else{print(0)}
```
[Try it online](https://tio.run/##XY7RCsIgFIZfZbtoeGCIbhZJ2X3QG0QXkQ6EaWMaBblnNwfCqqtz@M73c3731J1nMfbKF06M6ipP2ioE5W4mRhytRw67R9fpF2KAh1HNWwPZkNn45rorzJ6EYA60fQ@jTgKBKWFEMcbNFvDtbv1VW4ckZIHCpHqnipSVQjQ8hDRakq8l@usB5YoJQarKJBl@si3NoTOrNzWvKb0s/0x2l1oxkjWhnH8A)
[Answer]
# [JavaScript (Node.js)](https://nodejs.org), 53 bytes
```
s=>`2${s&3&&1}2323223232`[s[2]+s[3]-1]>s/1e4-29&s>1e4
```
[Try it online!](https://tio.run/##jdRvS8JQFAbw936Ka4TbSO2e@2e7p5gRZBAFfYA1UGyWIi52rTfRZ7c5IqT7vAhB5cfDwz0729bzj7lfNKu33WhbP1f7Zb73@WSmTj/9QA8G9KV0@@m@ZoUvVHnmC12OqJz4c6rMSPHAT9o/@8uiJ0QhTqSUluhkKJbzja9EOfzlFDC1/n@WVhJzy7vmvRLHrNgh1pyFnErDaciZtGxDJpmyCbg9YMY6ZCsdq4CVlMwUsiXJMixxRA5MqUm5cEp9uFYmuFQdW8SE04TTCqcVTmuc1jhtpEHjGGkRW9xtcXeKu1PcneHuDHc7nHY4zfgkDE9CeJeEd0kEu4lwN94l4V0S3iXhXZLBaQPSyrW3T3jbd0yYFWaN2WC2mFPMGebwAVT8M86fKRmPw3gcxuMwfAA7tjidYs4wu/Ade3hxHHGv7I2XdTOdL17juPBD0ZSJyCdiUW99vanGm/ql42Xsk6Ho9w@/Is9FI65E9HgfiQsR3V7fPUxvonK8rlfbOHraRUmS7L8B "JavaScript (Node.js) – Try It Online")
[Answer]
# [Raku](https://raku.org) (raku -n file-with-one-line) 118 Bytes
```
/(..)(.)(.)(..)/;$!=10*$1+$2;die if 12 <$!||1>$!;$!=7.5-abs(7.5-$!);$!=($!+|4)+^1 if $!!= 2;Date.new($3%4??0!!1,$!,$0)
```
Result as exit code (0: ok, 1: error)
]