Days and months make years
Japt, 31 30 26 24 23 22 17 bytes
Locale dependent. Outputs a 2D-array of the format [[&quot;MM&quot;,&quot;DD&quot;],...].
á â mò fÈÎ-ÐNcX)Î

Try it or Try It Online! (to avoid the locale dependency)
Explanation
If it wasn't for JavaScript's Date object wrapping invalid dates, I'd be able to get this down to about 20 18 16 bytes. Even when providing its argument as a single string, which the spec says shouldn't lead to wrapping, dates up to 31 still do for months that don't have 31 days. However, as the month's can only wrap over by one, we can take advantage of the fact that string arguments use 1-based months to simply filter by subtraction - if the month rolls over then the result of that subtraction will be 0.
á â mò fÈÎ-ÐNcX)Î     :Implicit input of N=[U=&quot;YYYY&quot;]
á                     :Permutations of U
  â                   :Deduplicate
    m                 :Map
     ò                :  Partitions of length 2 (=[[&quot;MM&quot;,&quot;DD&quot;],...])
       f              :Filter
        È             :By passing each X through the following function
         Î            :  First element of X
          -           :  Subtract
           Ð          :  Create new Date from
            NcX       :    N concatenated with X (=[&quot;YYYY&quot;,&quot;MM&quot;,&quot;DD&quot;], which gets coerced to &quot;YYYY-MM-DD&quot;, with MM being 1-based)
               )      :  End date creation
                Î     :  0-based month (=NaN for invalid dates, n-NaN=NaN)


Original, 22 bytes
Preserving this, 'cause I really liked the setwise union trick.
á
â¡ÐNcXòÃfÈÎ-2îUvÃms7

Try it (footer formats the output to match the examples in the challenge)Or Try it online! to somewhat mitigate the locale dependency - TIO's locale doesn't include leading 0s for dates &amp; months, so they're added back in in the footer.
Explanation
á\nâ¡ÐNcXòÃfÈÎ-2îUvÃms7     :Implicit input of N=[U=&quot;YYYY&quot;]
á                           :Permutations of U
 \n                         :Reassign to U, leaving the value in N unchanged
   â                        :Setwise union with
    ¡                       :Map each X in U
     Ð                      :  New Date from
      Nc                    :  N concatenated with
        Xò                  :  Partitions of X of length 2 (=[&quot;YYYY&quot;,&quot;MM&quot;,&quot;DD&quot;], which gets coerced to &quot;YYYY-MM-DD&quot;, with MM being 1-based)
          Ã                 :End map
           f                :Filter by
            È               :Passing each through the following function
             Î              :  Get 0-based month (=NaN for invalid date)
              -             :  Subtract (NaN-n=NaN)
               2î           :  First 2 characters of
                 Uv         :  Remove and return first element of U
                   Ã        :End filter
                    m       :Map
                     s7     :  To locale date string (=&quot;DD/MM/YYYY&quot;)

The reason the setwise union doesn't include any elements from the first array is because v modifies that array so the filter ends up removing all elements from it.
In the 16 byte version, which assumes a way to avoid dates wrapping over, we don't need to reassign the array of possible dates to U and instead filter by using Í to try to subtract the timestamp from 2, which will result in NaN if the date is invalid. We can't use the setwise union trick, though, so â get tacked on the end to deduplicate the final array.