Bla*_*ght 6 c# validation datetime
如果之前有人问过,请道歉.我有一些数据需要存储为字符串,其中一些数据是日期.数据以"01/02/10" (英国格式)等字符串开头.现在,稍后,这个数据被解析,并且根据解析的不同,结果是不同的(例如,01-Feb-10对比02-Jan-10).鉴于数据以字符串形式开始,在我存储它之前,我想说,"如果这看起来像日期,请将其格式化为dd-mmm-yy".
麻烦的是很多东西看起来像是DateTime.Parse()函数的日期.
所以,我应用了一些规则,只为我的检查接受"合理的"日期格式,并写了一个IsDate()函数.我正在寻求关于如何做到这一点的建议,因为虽然它有效但我的解决方案看起来非常笨重.
如果你曾经开始在它上面抛出随机字符串(比如"3/4"和"6.12"),那么我做这个而不是按照常规的DateTime.TryParse例程的原因很明显.
这是我到目前为止所拥有的:
class Program
{
static void Main(string[] args)
{
Debug.Assert(IsDate(6.12) == false);
Debug.Assert(IsDate("3/4") == false);
Debug.Assert(IsDate(010210) == false);
Debug.Assert(IsDate("010210") == false);
Debug.Assert(IsDate("12-jan-2000") == true);
Debug.Assert(IsDate("12-12-20") == true);
Debug.Assert(IsDate("1/1/34") == true);
Debug.Assert(IsDate("09/30/20") == false);
Debug.Assert(IsDate(DateTime.Now) == true);
}
static Boolean IsDate(Object value)
{
DateTimeFormatInfo DateTimeFormatGB = new CultureInfo("en-GB").DateTimeFormat; // new CultureInfo("en-US").DateTimeFormat;
return IsDate(value, DateTimeFormatGB);
}
static private List<String> AcceptableDateFormats = new List<String>(72);
static Boolean IsDate(Object value, DateTimeFormatInfo formatInfo)
{
if (AcceptableDateFormats.Count == 0)
{
foreach (var dateFormat in new[] { "d", "dd" })
{
foreach (var monthFormat in new[] { "M", "MM", "MMM" })
{
foreach (var yearFormat in new[] { "yy", "yyyy" })
{
foreach (var separator in new[] { "-", "/" }) // formatInfo.DateSeparator ?
{
String shortDateFormat;
shortDateFormat = dateFormat + separator + monthFormat + separator + yearFormat;
AcceptableDateFormats.Add(shortDateFormat);
AcceptableDateFormats.Add(shortDateFormat + " " + "HH:mm"); // formatInfo.TimeSeparator
AcceptableDateFormats.Add(shortDateFormat + " " + "HH:mm:ss");
}
}
}
}
}
String sValue = value.ToString().Trim();
DateTime unused;
foreach (String format in AcceptableDateFormats)
{
if (DateTime.TryParseExact(sValue, format, formatInfo, DateTimeStyles.None, out unused) == true) return true;
}
return false;
}
}
Run Code Online (Sandbox Code Playgroud)
我没有使用文化信息中的日期/时间分隔符,因为我想接受"/"和" - ".我想我可以使用时间,因为这不太可能改变(对我而言).
将字符串转换为你约会或者指定使用特定格式的文化:像我们要转换字符串日期"DD/MM/YYYY"到日期..
datetime mydate = Convert.ToDateTime(
txtdate.Text, CultureInfo.GetCulture("en-GB")
);
Run Code Online (Sandbox Code Playgroud)
或使用ParseExact方法:
datetime mydate = DateTime.ParseExact(
txtdate.Text, "dd/MM/yyyy", CultureInfo.Invariant
);
Run Code Online (Sandbox Code Playgroud)
该方法ParseExact只接受特定格式,而Convert.ToDateTime方法仍然允许在格式一些变型中,也接受其他一些日期格式.
要捕获非法输入,可以使用TryParseExact方法:
DateTime d;
if (DateTime.TryParseExact(txtdate.Text, "dd/MM/yyyy", CultureInfo.Invariant, DateTimeStyles.None, out d)) {
datetime mydate = d;
} else {
// communcate the failure to the user
}
Run Code Online (Sandbox Code Playgroud)
我希望以下链接可以为您提供一些帮助:
http://dotnetacademy.blogspot.com/2010/09/convert-string-to-date.html
http://msdn.microsoft.com/en-us/library/system.datetime.tryparse.aspx
http://msdn.microsoft.com/en-us/library/9h21f14e.aspx
http://dotnetacademy.blogspot.com/2009/10/get-current-system-date-format.html
这是tryParse的示例:http: //dotnetperls.com/datetime-tryparse
最后,我选择了以下版本:
static private List<String> AcceptableDateFormats = new List<String>(180);
static Boolean IsDate(Object value, DateTimeFormatInfo formatInfo)
{
if (AcceptableDateFormats.Count == 0)
{
foreach (var dateFormat in new[] { "d", "dd" })
{
foreach (var monthFormat in new[] { "M", "MM", "MMM" })
{
foreach (var yearFormat in new[] { "yy", "yyyy" })
{
foreach (var separator in new[] { "-", "/", formatInfo.DateSeparator })
{
String shortDateFormat;
shortDateFormat = dateFormat + separator + monthFormat + separator + yearFormat;
AcceptableDateFormats.Add(shortDateFormat);
AcceptableDateFormats.Add(shortDateFormat + " " + "HH:mm");
AcceptableDateFormats.Add(shortDateFormat + " " + "HH:mm:ss");
AcceptableDateFormats.Add(shortDateFormat + " " + "HH" + formatInfo.TimeSeparator + "mm");
AcceptableDateFormats.Add(shortDateFormat + " " + "HH" + formatInfo.TimeSeparator + "mm" + formatInfo.TimeSeparator + "ss");
}
}
}
}
AcceptableDateFormats = AcceptableDateFormats.Distinct().ToList();
}
DateTime unused;
return DateTime.TryParseExact(value.ToString(), AcceptableDateFormats.ToArray(), formatInfo, DateTimeStyles.AllowWhiteSpaces, out unused);
}
Run Code Online (Sandbox Code Playgroud)