DateTime.Parse(myString)有什么问题?

时间:2008-10-02 13:44:17

标签: c# datetime

我正在浏览Scott Hanselman的Developer Interview question list,并遇到了这个问题:

  

有什么问题   DateTime.Parse(myString的)?

虽然我知道在解析一串未知格式或原点时存在固有的风险,还有其他原因吗?是否使用DateTime.ParseExact代替?它应该是myString.ToString()吗?

8 个答案:

答案 0 :(得分:27)

此外,语言环境问题DateTime.Parse()也可能抛出一个您必须捕获的异常。请改用DateTime.TryParse()DateTime.TryParseExact()

答案 1 :(得分:14)

在系统上使用当前的线程文化通常是一个坏主意,“尝试各种格式,看看它们是否有效。”

具有特定文化的ParseExact是一种更加可控和精确的方法。 (即使你指定了当前的文化,它也会让读者更加明白这就是正在发生的事情。)

答案 2 :(得分:6)

正如MSDN所说:

  

因为Parse(String)方法尝试   解析字符串表示   使用格式的日期和时间   尝试当前文化的规则   解析特定的字符串   不同的文化可能会失败或   返回不同的结果。如果一个   具体的日期和时间格式   解析不同的语言环境,使用   DateTime.Parse(String,   IFormatProvider)方法或其中之一   ParseExact方法的重载和   提供格式说明符。

答案 3 :(得分:3)

这个问题只是为了看开发人员是否知道问题。首先你应该使用TryParse,因为如果Parse不可解析,Parse会抛出异常。此外,它不考虑区域设置,因此在Web场景中,如果英国用户键入02/10/2008,而我的服务器使用的是en-US区域设置,则会在2008年2月10日而不是2008年10月2日。

可能还有其他问题,但这些问题是出现在脑海中的前两个问题。

答案 4 :(得分:1)

除了未知的用户输入之外,环境可能是未知的...,所以我猜即使你控制输入格式,解析所期望的可能也不同......

答案 5 :(得分:1)

我的直觉反应是你用未知的格式/起源命中它。可能还有其他原因 - 例如,从该单行开始,我们知道 myString是一个字符串吗? (我当然是假设它。)

一般来说,我建议使用TryParse方法。它稍微冗长一点,但有助于防止异常 - 只要您的代码在输入无效的情况下表现得恰当。

当然,基于你对此的措辞......我假设你已经知道了这一切。 :)

答案 6 :(得分:0)

此博客文章explains it,但一般情况是没有与解析相关联的cultureinfo。

答案 7 :(得分:0)

答案取决于围绕DateTime.Parse(myString)的代码和解析的要求

您可能已经检查过字符串是基于正则表达式的有效格式,您可能对文化信息不感兴趣。您可能还知道数据来自具有已知日期约定的已知文件格式,因此抛出异常可能正是所期望的。

在没有上下文的情况下,这个问题非常模糊,对它的真正答案必须是“它取决于使用代码的上下文,如果有什么问题,如果