DateTime.Parse可以格式化exception格式的字符串吗?

我正在查看应用程序中的代码(其他人写的),在某些情况下它工作正常,在某些情况下它给出了exception,它实际上是在datetime中转换字符串,这里是代码

//5000 is the year,but what about "1" is it month or day ?,if its month //then what about the day ? DateTime time = DateTime.Parse("1.5000");//1.5000 doesn't looks a date to me ? time.ToString();//returns "1/1/5000 12:00:00 AM" //where as if I give this string to DateTime.Parse(); time = DateTime.Parse("2341.70"); //FormatException was unhandled //String was not recognized as a valid DateTime. 

令人困惑的想法
这个字符串“3.5000”(它与1.5000模式匹配)如何评估,这是否意味着3-3-5000或1-3-5000,格式模糊不清,令人困惑!

我的问题是,

  1. DateTime.Parse可以期望什么样的格式?
  2. 上面的代码中发生了什么?
  3. 建议改进代码?

许多人已经评论了你看到成功的解析的可能原因,但你的问题似乎有几个独立的部分……

1. DateTime.Parse期望什么样的格式?

DateTime.Parse已被编写为尽可能包容。 几乎任何它可以找到进入DateTime的东西,它会尽力做到这一点,这意味着除了通常熟悉的yyyy-MM-dd类型格式更奇怪的,如M.yyyy或yyyy.M等等。

2.上面的代码中发生了什么?

这非常复杂,因为DateTime.Parse方法本身非常复杂。 你可以在某个地方填写源代码,但复杂性使我很难遵循。 如果不能提供准确的细节,我将按照上述相同的方式回答这个问题。 发生的事情是框架正在尽力给你一个约会,而不是抛出exception。 它给出的日期是你的意思的最佳猜测。

3.建议改进代码?

听起来好像你正在获得解析exception,你正在以意想不到的格式传递日期。 不知道那些输入很难说。 但有两件事可以改善您的代码。 确保使用单个一致的日期格式,然后使用DateTime.ParseExact确保它符合正确的格式。 你会以这种方式消除所有歧义,但你会牺牲灵活性。

第二个选项是使用DateTime.TryParse 。 这将尝试解析您的日期,然后返回一个布尔值,说明它是否成功。 如果成功,将在ref参数中返回日期解析。 这不会使您的代码更好地识别未知的日期格式,但会让您的代码知道何时出现这种不可解析的格式并且您可以处理它(例如,通过提供用户反馈报告错误的格式并建议正确的格式,或者只需记录它或其他东西)。

最好的方法取决于您输入的来源。 如果是用户输入,那么我将使用第二个选项。 如果是自动输入,那么您可能希望确保输入是标准化的,然后使用第一个选项。 当然情况总是不同的,所以这不是一个硬性规定。 🙂

关于“2.上面的代码中发生了什么?”:

在某些文化中,日期分隔符是点而不是斜杠。 因此,例如13.12.2013是格式为"dd.MM.yyyy"的有效日期( 2013-12-13 )。 现在通过任何设计选择,此示例中的日期部分不是强制性的,如果省略,则自动填充1 。 因此解析12.2013将导致2013-12-01 。 因此很容易看出1.5000将如何变成5000-01-012341.70 无法解析,因为2341不是有效月份。 – 所以在这种情况下, 1.5000M.yyyy格式的“有效”日期。