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

Owa*_*shi 5 .net c# 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.
Run Code Online (Sandbox Code Playgroud)

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

我的问题是,

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

Chr*_*ris 3

许多人都对您所看到的解析成功的可能原因发表了评论,但您的问题似乎有几个单独的部分......

1. DateTime.Parse 需要什么类型的格式?

DateTime.Parse 已被编写为尽可能具有包容性。几乎任何它能找到某种方式制作成 DateTime 的东西都会尽力做到这一点,这意味着除了通常熟悉的 yyyy-MM-dd 类型格式之外,还有更奇怪的格式,例如 M.yyyy 或 yyyy.M 等等。

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

这是非常复杂的,因为该DateTime.Parse方法本身非常复杂。您可能可以在某处找到源代码,但其复杂性使我很难理解。由于无法提供准确的细节,我将像上面一样回答这个问题。正在发生的情况是,框架正在尽力为您提供日期而不是抛出异常。它给出的日期是对您的意思的最佳猜测。

3. 改进代码的建议?

听起来如果您遇到解析异常,则表明您正在以意外的格式传递日期。如果不知道这些输入是什么,就很难说。不过,有两件事可以改进您的代码。确保使用单一一致的日期格式,然后使用它DateTime.ParseExact来确保它符合正确的格式。通过这种方式,您可以消除所有歧义,但会牺牲灵活性。

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

最好的方法主要取决于您的输入来自哪里。如果是用户输入,那么我会选择第二个选项。如果是自动输入,那么您可能需要确保您的输入是标准化的,然后使用第一个选项。当然,情况总是会有所不同,因此这不是一个硬性规定。:)