C#中的DateTime.TryParse让我感到困惑。

7

我在我的程序中使用了 DateTime.TryParse 方法来判断一个字符串值是否为 DateTime,然后我注意到了这个问题:

DateTime.TryParse("9.08", out DateTime dt)
// true
DateTime.TryParse("2.52", out DateTime dt)
// false

为什么会发生这种情况?

8
你对 2.52 有什么期望?是指二月的第52天吗?还是指第2个月的第52天?true 表示转换成功,false 表示转换失败。 - Adelin
参见:https://dev59.com/fHrZa4cB1Zd3GeqPzjVu - Corak
必须将其视为9(月)8(日),ToT - 1pgjy
你可能想检查你的字符串是否与特定格式匹配?在这种情况下,你可以使用TryParseExact - Magnus
3个回答

12

DateTime.TryParse 方法将尝试使用当前线程文化提供的当前 DateTimeFormatInfo 对象中的格式规则来解析日期和时间的字符串表示形式。

因为 DateTime.TryParse(String, DateTime) 方法尝试使用当前文化的格式规则来解析日期和时间的字符串表示形式,所以在不同的文化中尝试解析特定的日期和时间格式可能会失败或返回不同的结果。如果要在不同的区域设置中解析特定的日期和时间格式

在某些文化中,DateTime 分隔符是 . 而不是 /

在我的计算机上。

DateTime.TryParse 将解析 "9.08" 为今年的 '09/08'2018/09/08 是一个有效的 datetime,因此结果为 true

DateTime.TryParse 将解析 "2.52" 为今年的 '02/52',但是二月份没有第52天,2018/02/52 不是一个有效的 DateTime,因此结果为 false

我会使用 DateTime.TryParseExact 方法来解析日期和时间,因为您可以设置特定的 CultureInfoParse DateTime 字符串作为参数,并确保其符合您预期的格式。

DateTime.TryParseExact("09.08",
                       "MM.dd",
                        System.Globalization.CultureInfo.InvariantCulture,
                        System.Globalization.DateTimeStyles.None,
                        out dt);

5
取决于文化环境。在我的德国电脑上,第一个日期是“2018年8月9日”。 - KekuSemau
1
或者创建您自己的 var customFormatInfo = new DateTimeFormatInfo { DateSeparator = "." }; 并在 DateTime.TryParse("9.08", customFormatInfo, DateTimeStyles.None, out var dt) 中使用它。 - Corak

1
根据DateTime.TryParse文档:

返回一个值,指示转换是否成功。

由于无法将"2.52"解析为任何有效日期,因此它返回了false

0

除非你试图理解.NET的每个时间字符串转换,否则你不应该能够回答“为什么会发生这种情况?”

DateTime.TryParse只是一个简单的条件处理,以防止在执行时出现错误。

Convert.ToDateTime(dateString)

因此,DateTime.TryParse = false 表示您不应该对该字符串执行 Convert.ToDateTime

相反,如果一个字符串到 DateTime.TryParse = true,那么它意味着该字符串应该符合 .NET 日期字符串的期望(这意味着 .NET 知道如何将该字符串转换为 DateTime)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接