Mi sono accorto di una imprecisione:

cambia questa riga

if (dd < 1) return false;

con questa

if ((dd < 1) || (dd > 31)) return false;