I'd set up a DateFormat and try to parse() the
string entered by the user. It will throw an exception for invalid data. If you were running a batch of these things, say importing millions of rows into a database, the overhead of try-throw-catch might be a factor, but I'd have to prove it's a performance problem before I tried to replace it with regular expressions and my own checking.