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

时间:2013-12-13 06:25:04

标签: c# .net datetime

我正在查看应用程序中的代码(其他人写的),在某些情况下它运行正常,在某些情况下它给出了异常,它实际上是在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. 改进代码的建议?

2 个答案:

答案 0 :(得分:3)

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

<强> 1。 DateTime.Parse期望什么样的格式?

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

<强> 2。上面的代码中发生了什么?

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

第3。建议改进代码?

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

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

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

答案 1 :(得分:2)

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

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