I am suppose to let the user enter a DateTime format, but I need to validate it to check if it is acceptable. The user might enter \"yyyy-MM-dd\" and it would be fine, but t
Unless I am remembering incorrectly, the only invalid DateTime format strings are one character long. You can assume any 2 or more character DateTime format string is valid.
DateTime.ParseExact("qq", "qq", null) == DateTime.Today
DateTime.ParseExact("myy", "501", null) == "05/01/2001"
Standard (1 character)
Custom (>1 character)
For reference, allowed single character strings as formats:
d,D,f,F,g,G,m,M,o,O,r,R,s,T,u,U,y,Y
Any other character, such as q
, by itself is invalid. All other strings will be successfully parsed as formatting strings.
My solution was to mark the input-field as read-only and allow users to change the value only by jqueryui datepicker.
It is intuitive. You can specify your preferred format and need only to validate this one format.
Are you looking for something like this?
DateTime expectedDate;
if (!DateTime.TryParse("07/27/2012", out expectedDate))
{
Console.Write("Luke I am not your datetime.... NOOO!!!!!!!!!!!!!!");
}
If your user knows the exact format(s) needed...
string[] formats = { "MM/dd/yyyy", "M/d/yyyy", "M/dd/yyyy", "MM/d/yyyy" };
DateTime expectedDate;
if (!DateTime.TryParseExact("07/27/2012", formats, new CultureInfo("en-US"),
DateTimeStyles.None, out expectedDate))
{
Console.Write("Thank you Mario, but the DateTime is in another format.");
}
I don't know of any way to actually validate the format they enter since sometimes you want to intentionally include characters that translate into anything. One thing you might consider is allowing the user to self validate by showing a preview of what their entered format translates into.
You don't talk about your validation strategy. Anyway you should use something involving regular expressions and than apply allowed patterns. This would help against the formal validity .. then you have to take care about the actual contents and be sure the values are correct according as month, day and year.
Anyway several people suggested to use the DateTime.TryParse() method to let the substrate take care for you. But you'll have to specify the format anyway! so there's no magic! you would fall in ambiguity otherwise
I assume you want to know if the specified format string is valid...
For this you could round-trip it:
private bool IsValidDateFormat(string dateFormat)
{
try
{
String dts=DateTime.Now.ToString(dateFormat, CultureInfo.InvariantCulture);
DateTime.ParseExact(dts, dateFormat, CultureInfo.InvariantCulture);
return true;
}
catch (Exception)
{
return false;
}
}