我正在浏览Scott Hanselman的Developer Interview question list,并遇到了这个问题:
有什么问题 DateTime.Parse(myString的)?
虽然我知道在解析一串未知格式或原点时存在固有的风险,还有其他原因吗?是否使用DateTime.ParseExact代替?它应该是myString.ToString()吗?
答案 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)的代码和解析的要求
您可能已经检查过字符串是基于正则表达式的有效格式,您可能对文化信息不感兴趣。您可能还知道数据来自具有已知日期约定的已知文件格式,因此抛出异常可能正是所期望的。
在没有上下文的情况下,这个问题非常模糊,对它的真正答案必须是“它取决于使用代码的上下文,如果有什么问题,如果