我正在查看应用程序中的代码(其他人写的),在某些情况下它运行正常,在某些情况下它给出了异常,它实际上是在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 需要什么类型的格式?
DateTime.Parse 已被编写为尽可能具有包容性。几乎任何它能找到某种方式制作成 DateTime 的东西都会尽力做到这一点,这意味着除了通常熟悉的 yyyy-MM-dd 类型格式之外,还有更奇怪的格式,例如 M.yyyy 或 yyyy.M 等等。
2. 上面的代码发生了什么?
这是非常复杂的,因为该DateTime.Parse方法本身非常复杂。您可能可以在某处找到源代码,但其复杂性使我很难理解。由于无法提供准确的细节,我将像上面一样回答这个问题。正在发生的情况是,框架正在尽力为您提供日期而不是抛出异常。它给出的日期是对您的意思的最佳猜测。
3. 改进代码的建议?
听起来如果您遇到解析异常,则表明您正在以意外的格式传递日期。如果不知道这些输入是什么,就很难说。不过,有两件事可以改进您的代码。确保使用单一一致的日期格式,然后使用它DateTime.ParseExact来确保它符合正确的格式。通过这种方式,您可以消除所有歧义,但会牺牲灵活性。
第二个选项是使用DateTime.TryParse. 这将尝试解析您的日期,然后返回一个布尔值,说明它是否成功。如果成功,日期解析将在 ref 参数中返回。这不会使您的代码更好地识别未知的日期格式,但会让您的代码知道何时出现这种无法解析的格式,并且您可以处理它(例如,通过提供报告错误格式的用户反馈并建议正确的格式,或者只是通过记录它或其他东西)。
最好的方法主要取决于您的输入来自哪里。如果是用户输入,那么我会选择第二个选项。如果是自动输入,那么您可能需要确保您的输入是标准化的,然后使用第一个选项。当然,情况总是会有所不同,因此这不是一个硬性规定。:)