我在我的程序中使用了 DateTime.TryParse
方法来判断一个字符串值是否为 DateTime
,然后我注意到了这个问题:
DateTime.TryParse("9.08", out DateTime dt)
// true
DateTime.TryParse("2.52", out DateTime dt)
// false
为什么会发生这种情况?
我在我的程序中使用了 DateTime.TryParse
方法来判断一个字符串值是否为 DateTime
,然后我注意到了这个问题:
DateTime.TryParse("9.08", out DateTime dt)
// true
DateTime.TryParse("2.52", out DateTime dt)
// false
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 方法来解析日期和时间,因为您可以设置特定的 CultureInfo
和 Parse
DateTime 字符串作为参数,并确保其符合您预期的格式。
DateTime.TryParseExact("09.08",
"MM.dd",
System.Globalization.CultureInfo.InvariantCulture,
System.Globalization.DateTimeStyles.None,
out dt);
var customFormatInfo = new DateTimeFormatInfo { DateSeparator = "." };
并在 DateTime.TryParse("9.08", customFormatInfo, DateTimeStyles.None, out var dt)
中使用它。 - Corak除非你试图理解.NET的每个时间字符串转换,否则你不应该能够回答“为什么会发生这种情况?”
DateTime.TryParse只是一个简单的条件处理,以防止在执行时出现错误。
Convert.ToDateTime(dateString)
因此,DateTime.TryParse = false
表示您不应该对该字符串执行 Convert.ToDateTime
。
相反,如果一个字符串到 DateTime.TryParse = true
,那么它意味着该字符串应该符合 .NET 日期字符串的期望(这意味着 .NET 知道如何将该字符串转换为 DateTime)。
2.52
有什么期望?是指二月的第52天吗?还是指第2个月的第52天?true
表示转换成功,false
表示转换失败。 - AdelinTryParseExact
。 - Magnus