在没有指定所有值的情况下解析日期

kev*_*ner 14 c# datetime date-parsing

我使用自由格式日期作为搜索语法的一部分.我需要从字符串中解析日期,但只保留实际指定的日期部分.例如,"2010年11月1日"是特定日期,但"2010年11月"是"2010年11月1日"至"2010年11月30日"的日期范围.

不幸的是,DateTime.Parse和朋友解析这些日期DateTime:

DateTime.Parse("November 1, 2010") // == {11/1/2010 12:00:00 AM}
DateTime.Parse("November, 2010") // == {11/1/2010 12:00:00 AM}
Run Code Online (Sandbox Code Playgroud)

我需要知道DateTime实际解析的哪些部分以及解析器猜到的部分.基本上,我需要DateTime.Parse("November, 2010") == {11/-1/2010 -1:-1:-1}; 然后我可以看到缺少日期部分并计算整个月的日期范围.

(在内部,C#有DateTimeParseDateTimeResult类来解析日期并保留我需要的信息,但是当日期回到公共接口时它被剥离了.我宁愿避免反思这些类,除非那是真的唯一的路线.)

有没有办法DateTime.Parse告诉我它用来解析日期的格式?或者返回的DateTime是否有未指定部分的占位符?我也愿意使用另一个日期解析器,但我希望它与内部解析器一样可靠且区域灵活.提前致谢.

编辑:我也尝试过ParseExact,但枚举所有Parse可以处理的格式似乎几乎不可能.Parse实际上接受的格式多于返回的格式DateTimeFormatInfo.GetAllDateTimePatterns,这与我可以找到的规范源代码相同.

Kei*_*thS 2

您可以尝试使用 TryParseExact(),如果数据字符串不是指定的确切格式,它将失败。尝试一堆不同的组合,当其中一个成功时,您就知道日期的格式,从而知道日期中不存在的部分以及解析器为其填充的默认值。缺点是您必须预测用户将如何输入日期,因此您可以准确地预料到这一点。

您还可以使用正则表达式自己消化日期字符串。同样,您将需要不同的正则表达式(或非常复杂的单个正则表达式),但当然也可以通过这种方式将字符串分开;然后你就知道你实际上拥有什么。