I think the technical reason it does this would be because month is an enumerated field, meaning that it can be mapped to an array of month names, and arrays count from zero, whereas years and days are not enumerated; you always just want the actual number value, so that's what is stored.
It is a perfectly valid question to ask though, because if you're using months as a number then it can seem a bit weird (not to mention easy to forget).
By the way, if you're working with dates, particularly extracting dates from strings and formatting them into strings, you might want to look into Date.js, which is a javascript library that can help a lot with all this kind of thing.