如果未指定年份,如何使 DateTime.TryParse() 失败?

Mat*_*son 4 c# datetime parsing

考虑以下代码来解析日期。(请注意,我处于 ​​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.");
Run Code Online (Sandbox Code Playgroud)

我故意省略了年份。但是,TryParse()将解析此数据而不会出现任何错误,并将替换当前年份。

我希望能够强制用户输入日期的所有组成部分(使用其本地格式),因此我希望上述解析失败 - 或者能够检测到用户没有输入一年。

我真的不想使用DateTime.TryParseExact(),因为那样我就必须添加代码来为所有不同的受支持区域设置指定所有不同的有效格式,这非常重要并且可能容易出错。不过,我怀疑这可能是我唯一明智的选择。

有人有什么想法吗?(这里有人已经实施了一个“解决方案”,其中涉及不允许当前年份,这显然不是一个好的解决方案......)

Cod*_*aos 5

您可以查询文化的模式,过滤掉那些没有年份的模式,然后使用TryParseExact其余的模式。

var allPatterns = culture.DateTimeFormat.GetAllDateTimePatterns();
var patternsWithYear = allPatterns.Where(s => s.Contains("y")).ToArray();
bool success = TryParseExact(input, patternsWithYear, culture, styles, out dateTime);
Run Code Online (Sandbox Code Playgroud)

已知错误:这没有考虑转义,您需要用Contains("y")正确的解析替换调用来修复此问题。

或者,如果您愿意接受更严格的格式限制,您也可以选择 justLongDatePattern和。ShortDatePattern