【发布时间】:2012-07-27 21:45:14
【问题描述】:
我想让用户输入 DateTime 格式,但我需要验证它以检查它是否可以接受。用户可以输入“yyyy-MM-dd”,这很好,但他们也可以输入“MM/yyyyMM/ddd”或任何其他组合。有没有办法验证这一点?
【问题讨论】:
标签: c# validation datetime
我想让用户输入 DateTime 格式,但我需要验证它以检查它是否可以接受。用户可以输入“yyyy-MM-dd”,这很好,但他们也可以输入“MM/yyyyMM/ddd”或任何其他组合。有没有办法验证这一点?
【问题讨论】:
标签: c# validation datetime
你在寻找这样的东西吗?
DateTime expectedDate;
if (!DateTime.TryParse("07/27/2012", out expectedDate))
{
Console.Write("Luke I am not your datetime.... NOOO!!!!!!!!!!!!!!");
}
如果您的用户知道所需的确切格式...
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.");
}
【讨论】:
我不知道有什么方法可以实际验证他们输入的格式,因为有时您想故意包含可以转换为任何内容的字符。您可能会考虑的一件事是允许用户通过显示他们输入的格式转换为的预览来进行自我验证。
【讨论】:
DateTime.Now.ToString("This is made up and won't work"); 之类的操作,预览将显示T1i30 i30 14a4e up an4 will noP work。你可以包裹在一个try/catch 块中来处理任何非常奇怪的事情。
我假设您想知道指定的格式字符串是否有效...
为此,您可以往返:
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;
}
}
【讨论】:
除非我记错了,否则唯一无效的 DateTime 格式字符串是一个字符长。您可以假设任何 2 个或更多字符的 DateTime 格式字符串都是有效的。
DateTime.ParseExact("qq", "qq", null) == DateTime.Today
DateTime.ParseExact("myy", "501", null) == "05/01/2001"
Standard (1 character)
Custom (>1 character)
供参考,允许使用单个字符串作为格式:
d,D,f,F,g,G,m,M,o,O,r,R,s,T,u,U,y,Y
任何其他字符,例如q,本身都是无效的。所有其他字符串都将成功解析为格式化字符串。
【讨论】:
% 前加上前缀,使单字符串也有效。 DateTime.Now.ToString("%x") == "x".
y 指定为h 并得到奇怪的结果。
您不会谈论您的验证策略。无论如何,您应该使用涉及正则表达式的东西,而不是应用允许的模式。这将有助于反对形式有效性..那么您必须注意实际内容并确保根据月、日和年的值是正确的。
无论如何,有几个人建议使用 DateTime.TryParse() 方法让基板照顾你。但是无论如何您都必须指定格式!所以没有魔法!否则你会陷入歧义
【讨论】:
这对我有用-
try
{
String formattedDate = DateTime.Now.ToString(dateFormat);
DateTime.Parse(formattedDate);
return true;
}
catch (Exception)
{
return false;
}
【讨论】:
static private bool IsValidDateFormat(string dateFormat)
{
try
{
DateTime pastDate = DateTime.Now.Date.Subtract(new TimeSpan(10, 0, 0, 0, 0));
string pastDateString = pastDate.ToString(dateFormat, CultureInfo.InvariantCulture);
DateTime parsedDate = DateTime.ParseExact(pastDateString, dateFormat, CultureInfo.InvariantCulture);
if (parsedDate.Date.CompareTo(pastDate.Date) ==0)
{
return true;
}
return false;
}
catch
{
return false;
}
}
我确实使用此代码 - 它是对 shapiro yaacov 发布的修改。 它看起来像“DateTime.ParseExact”在使用无效的日期格式字符串时不会引发异常 - 它只是返回“DateTime.Now”。 我的方法是将过去的日期转换为字符串,然后检查 ParseExact() 是否返回该日期
【讨论】:
ZipXap 的答案接受任何不引发异常的格式,但像“aaaa”这样的格式将通过该验证并在午夜给出当前日期(“26-Apr-22 00:00:00”在写作时这个)。
更好的方法是使用DateTimeStyles.NoCurrentDateDefault 选项并将结果与default 进行比较:
using System.Globalization;
var format = "aaaaa";
try {
var dt = DateTime.ParseExact(
DateTime.Now.ToString(format, CultureInfo.InvariantCulture),
format,
CultureInfo.InvariantCulture,
DateTimeStyles.NoCurrentDateDefault);
return dt != default;
} catch {
return false;
}
/*
"aaaaa" -> false
"h" -> false
"hh" -> true
"fff" -> true
"gg" -> false
"yyyy gg" -> true
"'timezone: 'K" -> false
"zzz" -> false
*/
【讨论】:
我的解决方案是将输入字段标记为只读,并允许用户仅通过jqueryui datepicker 更改值。
它很直观。您可以指定您的首选格式,并且只需要验证这一种格式。
否则你可能会遇到麻烦。你打算如何处理美国的“02/03/2020”,你将其解释为 2 月 3 日,但对于南美,它绝对是 三月二日。全球还有很多其他的日期格式。
【讨论】: