If we put these values through DateTime.Parse, then the only one that causes a problem is the last one, because it contains no date indication of any form:
Console.WriteLine(DateTime.Parse("1 April 2009"));
// Outputs 01/04/2009 00:00:00
Console.WriteLine(DateTime.Parse("Jan 2000"));
// Outputs 01/01/2000 00:00:00
Console.WriteLine(DateTime.Parse("March 90"));
// Outputs 01/03/1990 00:00:00
Console.WriteLine(DateTime.Parse("00"));
// Throws an exception
However, putting Jan at the start of the last string gives us:
Console.WriteLine(DateTime.Parse("Jan 00"));
// Outputs 01/01/2000 00:00:00
So, perhaps a slightly hacky solution is to regex match any string consisting solely of 2 or 4 numbers, and prefix it with the text "Jan"?
String sample = "00";
//check for 2 or 4 numbers in the string, nothing else
//except space before and after
if (Regex.IsMatch(sample, @"^\s*(\d{2}|\d{4})\s*$"))
{
sample = "Jan " + sample;
}
Console.WriteLine(DateTime.Parse(sample));
// Outputs 01/01/2000
That will also work if sample is 00, 2000, or any other 2 or 4 digit (plus whitespace) strings.
The 3/00 string as indicated in your comment is a doozy, DateTime won't except it if it's prefixed with a 0, or if the "/" is replace with whitespace.
What you need to do to that is check for a string containing a "/" followed by 2 digits, and then prefix those two digits with "20", resulting in "3/2000", which is parsed ok.
Annoyingly, the DateTime.Parse method does not allow for detection of null fields it found while parsing (it simply detected those as the start of the month/year).
Perhaps, as a UI suggestion, instead of trying to be too clever when putting into the database, while the user is typing in this crazy date string, parse it when the form (is it a web form?) is submitted. If the format is not immediately clear, suggest possibles to the user, like, did you mean 1950, or 2050?