我正在一个框架中生成代码。日期和房产的其中一个属性时间字段是它的格式。它必须是DateTime.ToString()
接受的格式,例如dd/MM/yyyy
。我如何验证在应用程序中键入的掩码是否是.ToString()
的有效日期时间模式?
答案 0 :(得分:3)
第一个变体使用System.Globalization。第二是脏。
static bool ValidateFormat(string customFormat)
{
return !String.IsNullOrWhiteSpace(customFormat) && customFormat.Length > 1 && DateTimeFormatInfo.CurrentInfo.GetAllDateTimePatterns().Contains(customFormat);
}
static bool ValidateFormat(string customFormat)
{
try
{
DateTime.Now.ToString(customFormat);
return true;
}
catch
{
return false;
}
}
答案 1 :(得分:1)
就个人而言,如果实际要求是给定格式必须导致DateTime.Now.ToString(format)
不抛出异常,那么在我看来,最可靠的方法是在try / catch块中使用该代码,如果它会酌情抛出异常处理。
需要注意的一点是,ToString
代码依赖于DateTimeFormatInfo
对象。这可能会使某些格式无效,但我无法确定。如果确实如此,则很可能会使用不同的日历等。但是,可能只需要本地化选项。对于您感兴趣的语言环境的所有(或至少是代表性样本),当然值得测试,或者最好只使用ToString(string format, IFormatProvider provider)
的{{1}}重载。
正如其他人对编程问题发表评论,同时期望异常通常不是好的做法,但在这种情况下我认为这是最佳匹配,因为a)它完全符合要求b)其他选项会更难程序,因此更容易出现错误。
这是您可能使用的示例方法。请注意,我特意捕获FormatException而不是所有异常,以防万一我们不想捕获的其他怪异错误。
DateTime.ToString
答案 2 :(得分:0)
这么简单......
class Program
{
static void Main(string[] args)
{
string s = "yyyy-MM-dd";
string reg = @"^\bdd/MM/yyyy\b$";
string reg1 = @"^\byyyy-MM-dd\b$";
if (Regex.IsMatch(s, reg))
Console.WriteLine("true");
else if (Regex.IsMatch(s, reg1))
Console.WriteLine("true");
// and so on..
Console.ReadLine();
}
}
OR
static void Main(string[] args)
{
string s = "dd/MM/yyyy";
string reg = @"(?<dateMatch>(^\bdd/MM/yyyy\b$)|(^\byyyy-MM-dd\b$))";
if (Regex.IsMatch(s, reg))
Console.WriteLine("true");
Console.ReadLine();
}
此方法将匹配两种日期模式。 “dd / MM / yyyy”和“yyyy-MM-dd”。 添加任意数量的模式,以便匹配。