How many days in a month?
JavaScript (ES6), 48 47 44 43 42 bytes
m=>31^'311'[parseInt(m[1]+m[2],34)*3%49%8]
Demo
let f =
m=>31^'311'[parseInt(m[1]+m[2],34)*3%49%8]
;(
'JAN,FEB,MAR,APR,MAY,JUN,JUL,AUG,SEP,OCT,NOV,DEC,' +
'JANUARY,FEBRUARY,MARCH,APRIL,MAY,JUNE,JULY,AUGUST,SEPTEMBER,OCTOBER,NOVEMBER,DECEMBER'
).split`,`
.forEach(m => console.log(m, '->', f(m)))
How?
These operations lead to a lookup table of 8 entries, which would not be very interesting if the values were randomly distributed. But any result greater than 2 is mapped to 31 days. Therefore, only the first 3 entries need to be stored explicitly.
Month | [1:2] | Base 34 -> dec. | * 3 | % 49 | % 8 | Days
------+-------+-----------------+------+------+-----+-----
JAN | AN | 363 | 1089 | 11 | 3 | 31
FEB | EB | 487 | 1461 | 40 | 0 | 28
MAR | AR | 367 | 1101 | 23 | 7 | 31
APR | PR | 877 | 2631 | 34 | 2 | 30
MAY | AY | 10 | 30 | 30 | 6 | 31
JUN | UN | 1043 | 3129 | 42 | 2 | 30
JUL | UL | 1041 | 3123 | 36 | 4 | 31
AUG | UG | 1036 | 3108 | 21 | 5 | 31
SEP | EP | 501 | 1503 | 33 | 1 | 30
OCT | CT | 437 | 1311 | 37 | 5 | 31
NOV | OV | 847 | 2541 | 42 | 2 | 30
DEC | EC | 488 | 1464 | 43 | 3 | 31
Javascript (ES6), 36 33 bytes
-3 bytes thanks to @JustinMariner and @Neil
m=>31-new Date(m+31).getDate()%31
Sorry @Arnauld, abusing JavaScript weirdness is shorter than your fancy base conversions.
How it works
For some reason, JavaScript allows entering dates outside of the specified month. The code counts how many days outside the month the date is to determine how many days there are in the month. Examples:
"FEB31"
→ Thu Mar 02 2000
→ 31 - 2 % 31
→ 29
"October31"
→ Tue Oct 31 2000
→ 31 - 31 % 31
→ 31
Test cases
f=m=>31-new Date(m+31).getDate()%31
;(
"JAN,FEB,MAR,APR,MAY,JUN,JUL,AUG,SEP,OCT,NOV,DEC,"+
"January,February,Mars,April,May,June,July,August,September,October,November,December"
).split`,`.forEach(s=>console.log(s,"->",f(s)))
Python 2, 46 45 38 bytes
-1 byte thanks to @totallyhuman
lambda m:29-int(m[1:3],35)%238%36%-5/2
Try it online!