2008-10-02 84 views
23

我在浏览斯科特Hanselman的Developer Interview question list,以及跨越这个问题跑了:DateTime.Parse(myString)有什么问题?

有什么不对 DateTime.Parse(myString的)?

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

+0

如果有人有兴趣,我写的关于这个问题在土耳其文的一篇文章[DateTime.Parse(string)kullanmayıbırakamazmıyız?](http://sonergonul.net/datetime-parse-string-kullanmayi-birakamaz-miyiz/)。 – 2016-01-14 12:04:16

回答

26

此外,区域设置问题DateTime.Parse()也可能会引发异常,您将不得不赶上。改为使用DateTime.TryParse()DateTime.TryParseExact()

+7

TryParse/TryParseExact非常适合当数据来自一个不可靠的来源时,如果你有充分的理由相信无效数据代表了一个重大的系统错误,那么抛出一个异常是正确的做法,把Parse转换成TryParse并不是一个好主意。 – 2008-10-02 13:49:03

0

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

14

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

ParseExact与特定的文化是一个更加控制和精确的方法。 (即使你指定当前的文化,这使得它更明显的读者,这是发生了什么事情。)

5

由于MSDN所说的那样:

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

1

除了未知的用户输入的环境可能是未知的......,所以我想,即使你控制输入格式,有什么期待解析可能会有所不同..

3

这个问题仅仅是看看开发者是否知道这个问题。首先,您应该使用TryParse,因为如果Parse不可解析,则Parse会引发异常。此外,它不考虑区域设置,所以在网络场景中,如果英国用户输入02/10/2008,并且我的服务器正在使用en-US语言环境,那么我会在2008年2月10日之前取代2008年10月2日。

可能还有其他问题,但这些是前两个想法。

1

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

通常我推荐使用TryParse方法。它稍微冗长些,但有助于防止异常 - 只要您的代码在无效输入的情况下适当运行。

当然,根据你的措词这个......我假设你已经知道这一切。 :)

0

答案取决于围绕DateTime.Parse(myString的),并解析

您可能已经检查字符串是基于正则表达式是有效的格式要求的代码,你可能不有趣的文化信息。您也可能知道数据来自已知日期约定的已知文件格式,因此抛出异常可能正是期望的。

没有上下文的问题是相当模糊的,真正的答案,它必须是“这取决于其中的代码被用作什么是错的情况下,如果