Seasons by month and day
Readability

Your conditional checks are very very long. They run off the screen. At the very least, add some new lines:

else if ((month == 9 &amp;&amp; day &gt;= 16 &amp;&amp; day &lt;= 30) || 
         (month == 10 &amp;&amp; day &gt;=1 &amp;&amp; day &lt;= 31) || 
         (month == 11 &amp;&amp; day &gt;= 1 &amp;&amp; day &lt;= 30) || 
         (month == 12 &amp;&amp; day &gt;=1 &amp;&amp; day &lt;=15))


But this still makes it very hard to actually understand what is going on. There's no really any notion of "range" in this code. You are simply hardcoding each individual month separately. 

Ranges

Representing the range "3/16 to 6/15" is difficult. Representing the range 316 to 615 is easy. If we don't care about checking for invalid dates, we can uniquely represent the year by doing month * 100 + day and looking at it that way.

int month_day = month * 100 + day;
if (month_day &lt;= 315) {
    System.out.println("Winter");
}
else if (month_day &lt;= 615) {
    System.out.println("Spring");
}
else if (month_day &lt;= 915) {
    System.out.println("Summer");
}
else if (month_day &lt;= 1215) {
    System.out.println("Fall");
}
else {
    System.out.println("Winter");
}


By treating the ranges as one-sided, it's easy to organize the code to actually look like we're looking for ranges. Winter simply appears on both ends for simplicity.