The way to deal with dates is not by having separate fields. It's by having a single value represent the time (in Linux it's time_t). Every other format gets translated to time_t, all processing is done with time_t, and then the time_t gets translated to the desired output format.
Any other scheme is doomed to working 99% of the time, and that last 1% will be impossible to fix.