C# DateTime.Parse的FormatException。检查“我的日期字符串”中的哪个部分是错误的

C# DateTime.Parse的FormatException。检查“我的日期字符串”中的哪个部分是错误的,c#,datetime,parsing,C#,Datetime,Parsing,我想验证文本框中的日期字符串 如果我的文本框中有2018-06-07字符串,我可以使用DateTime.TryParse或DateTime.parse成功地解析它 但是如果我的文本框中有2018-12-35,DateTime.Prase抛出FormatException,这绝对正确。 如何确定DateTime的哪一部分是错误的。例如,如何确定日期或月份是否错误。DateTime.Parse尝试了多种格式,有些与当前区域性有关,有些则与不变的格式有关。它似乎包含了一个使用ISO-8601格式“yy

我想验证文本框中的日期字符串

如果我的
文本框中有2018-06-07字符串,我可以使用
DateTime.TryParse
DateTime.parse
成功地解析它

但是如果我的
文本框中有2018-12-35
DateTime.Prase
抛出
FormatException
,这绝对正确。
如何确定DateTime的哪一部分是错误的。例如,如何确定日期或月份是否错误。

DateTime.Parse
尝试了多种格式,有些与当前区域性有关,有些则与不变的格式有关。它似乎包含了一个使用ISO-8601格式“yyyy-MM-dd”进行解析的尝试,该格式对第一个示例有效,但对第二个示例无效。(12月份没有35天。)

当它试图解析多种格式时,隔离哪个部分是“错误的”并不一定有意义——不同的部分可能对不同的格式无效

您应该如何解决这一问题取决于您的数据来自何处。如果它是机器可读的数据,最好强制使用区域性不变格式(理想情况下为ISO-8601),而不是使用
DateTime.Parse
:使用
DateTime.ParseExact
DateTime.TryParseExact
指定所需的格式。您仍然无法获得关于哪个部分出错的信息,但至少更容易进行推理。(这也将使我们更容易知道正在使用哪种日历系统。)

如果数据来自用户,理想情况下,您应该为他们提供某种形式的日历UI,这样他们根本不必输入文本。在这一点上,只有直接输入文本的用户才会产生无效的输入,您可能会将其视为“OK”,以便他们获得“this value is invalid”的全面错误消息

我不相信.NET提供了任何关于该值首次被视为无效的位置的指示,即使对于单个值也是如此。通过异常进行解析时提供更多信息,但不是以机器可读的方式。(异常消息提供诊断信息,但这可能不会向用户显示。)

简言之:在这里,您可能无法完全完成您想要做的事情(如果不编写自己的解析器或验证器),因此最好尝试找出替代方法。为此编写通用验证器将非常困难

如果只需要处理ISO-8601日期,则相对简单:

  • 用破折号分割输入。如果没有三个破折号,则无效
  • 将每一条输入解析为一个整数。可能会失败的(每件上分别)
  • 确认这一年是你乐于应付的一年
  • 验证月份是否在1-12范围内
  • 验证该天是否对该月有效(使用
    DateTime.DaysInMonth
    来帮助)

这其中的每一部分都相当简单,但您对这些信息所做的操作将特定于您的应用程序。我们没有足够的上下文来帮助编写代码,而不进行重要的假设。

据我所知,没有内置的方法来完成这项工作。没有现成的功能。你将不得不拆分字符串并分别检查它们中的每一个。每个人都知道我已经写了一个解析器,验证器,只是在想也许有一个更短,更好的方法。