我浏览了Scott Hanselman的开发者访谈问题列表,发现了这个问题:
怎么了DateTime.Passe(myString)?
虽然我知道解析未知格式或来源的字符串存在固有风险,但还有其他原因吗?是否使用DateTime.ParseExact?应该首先是myString.ToString()吗?
除了区域设置问题外,DateTime.Parse()
还可能引发异常,然后您必须捕获该异常。请改用DateTime.TryParse()
或DateTime.TryParseExact()
。
在系统上使用当前的线程区域性通常是个坏主意,就像"尝试各种格式,看看它们是否有效。"
具有特定区域性的ParseExact是一种更加可控和精确的方法。(即使您指定了当前的区域性,它也会让读者更清楚地看到这就是正在发生的事情。)
正如MSDN所说:
因为Parse(String)方法尝试解析的字符串表示形式使用格式的日期和时间当前文化的规则,尝试在不同的文化可能会失败或返回不同的结果。如果具体日期和时间格式为在不同的区域设置中解析,使用DateTime.Passe(字符串,IFormatProvider)方法或ParseExact方法的重载和提供格式说明符。
这个问题只是想看看开发人员是否知道其中的问题。首先,您应该使用TryParse,因为Parse会在不可解析的情况下抛出异常。此外,它也没有考虑区域设置,因此在web场景中,如果一个英国用户键入02/10/2008,而我的服务器使用的是en-US区域设置,则我会得到2008年2月10日,而不是2008年10月2日。
可能还有其他问题,但这是最初想到的两个问题。
除了未知的用户输入外,环境可能是未知的。。,所以我想,即使你控制了输入格式,解析所期望的也可能不同。。
我的直觉反应是,你用未知的格式/来源击中了它。可能还有其他原因——例如,从这一行中,我们知道myString
是一个字符串吗?(我想是的。)
一般来说,我建议使用TryParse方法。它稍微详细一些,但有助于防止异常——只要您的代码在无效输入的情况下表现适当。
当然,根据你的措辞。。。我想你已经知道了
这篇博客文章对此进行了解释,但总的来说,没有与解析相关的cultureinfo。
答案取决于DateTime.Parse(myString)周围的代码和解析的要求
您可能已经检查了字符串是否是基于正则表达式的有效格式,并且可能对区域性信息不感兴趣。您可能还知道,数据来自具有已知日期约定的已知文件格式,因此抛出异常可能正是所希望的。
如果没有上下文,这个问题就很模糊,真正的答案必须是"这取决于代码使用的上下文,如果