考虑以下代码来解析日期。 (请注意,我处于 EN-gb 区域设置):
const DateTimeStyles DATE_TIME_STYLES = DateTimeStyles.NoCurrentDateDefault | DateTimeStyles.AllowWhiteSpaces;
DateTime dt;
// Current culture for this example is "EN-gb".
if (DateTime.TryParse("31/12", CultureInfo.CurrentUICulture, DATE_TIME_STYLES, out dt))
Console.WriteLine("Parsed correctly"); // Do not want!
else
Console.WriteLine("Did not parse correctly.");
我故意省略了年份。然而,TryParse()
将解析它,没有任何错误,并将替换当前年份。
我希望能够强制用户输入日期的所有组成部分(使用其本地格式),因此我希望上述解析失败 - 或者能够检测到用户没有输入一年。
我真的不想用DateTime.TryParseExact()
因为那样我就必须添加代码来为所有不同的受支持区域设置指定所有不同的有效格式,这非常重要并且可能容易出错。不过,我怀疑这可能是我唯一明智的选择。
有人有什么想法吗? (这里有人已经实施了一个“解决方案”,其中涉及不允许当前年份,这显然不是一个好的解决方案......)
您可以查询文化的模式,过滤掉那些没有年份的模式,然后使用TryParseExact
关于其余的图案。
var allPatterns = culture.DateTimeFormat.GetAllDateTimePatterns();
var patternsWithYear = allPatterns.Where(s => s.Contains("y")).ToArray();
bool success = TryParseExact(input, patternsWithYear, culture, styles, out dateTime);
已知错误:这没有考虑转义,您需要替换Contains("y")
调用正确的解析来解决这个问题。
或者你也可以选择LongDatePattern
and ShortDatePattern
如果您愿意接受更严格的格式限制。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)