这行代码返回true
和time
等于"01/02/2016"
:
DateTime time;
bool result = DateTime.TryParse("1,2", CultureInfo.CurrentCulture, DateTimeStyles.None, out time);
如何返回false
?
我不使用DateTime.TryParseExact
,因为我必须指定像"YY/MM/DD"
这样的格式,但我需要在PC上使用默认格式。
对于您正在尝试做的事情,您可能最好使用TryParseExact。它不会对正在解析的字符串进行任意假设,而是返回false
,除非该字符串与您想要的模式完全匹配。
根据此,您应该能够指定区域性,并将"d"作为表示"短日期"的格式字符串。TryParseExact
应该效仿并使用您为短日期提供的区域性指定的格式。
如果您可以使用标准日期格式,那么您应该使用带有这些限定符之一的DateTime.TryParseExact
(在您的情况下,"d"
可能也可以)。否则,您将需要在DateTime.TryParse
周围使用自定义函数。
DateTime.TryParse
将尝试通过忽略一些缺失的数据并在可能的地方填充一些缺失的数据来提供帮助(参见MSDN)。如果希望使用当前区域性解析它,但仍然希望排除TryParse将视为有效的某些字符串,则应该在运行try parse之前排除它们。例如
public bool MyTryParse(string dateString, out DateTime dt)
{
dt = new DateTime();
if (dateString == null)
return false;
if (dateString.Length > 3)
return false;
return DateTime.TryParse(dateString, CultureInfo.CurrentCulture, DateTimeStyles.None, out dt);
}
您可以添加任何额外的特殊情况测试。请注意,TryParseExact
可能不是您想要的,,除非您可以使用标准日期格式作为指定的格式字符串(任何自定义的日期格式将覆盖CurrentCulture
可能规定的内容);例如,比较下面的输出:
DateTime dt;
bool res = DateTime.TryParseExact("02/03/2001", "MM/dd/yyyy", CultureInfo.GetCultureInfo("en-GB"), DateTimeStyles.None, out dt);
Console.WriteLine(dt);
// will output Feb 3, 2001, but a user in GB would probably intend Mar 3, 2001
bool res = DateTime.TryParseExact("02/03/2001", "d", CultureInfo.GetCultureInfo("en-GB"), DateTimeStyles.None, out dt);
Console.WriteLine(dt);
// will output Mar 3, 2001, but might be too restrictive for what you want?
res = DateTime.TryParse("02/03/2001", CultureInfo.GetCultureInfo("en-GB"), DateTimeStyles.None, out dt);
Console.WriteLine(dt);
// will output Mar 2, 2001, but goes back to your original problem