当尝试验证用户输入时,输入字符串"1,5"结果为有效日期:
var s = "1,5";
DateTime d;
var b = DateTime.TryParse(s,
CultureInfo.InvariantCulture,
DateTimeStyles.None,
out d);
Console.WriteLine("s: " + s);
Console.WriteLine("b: " + b);
Console.WriteLine("d: " + d);
输出是:
s: 1,5
b: True
d: 1/5/2021 12:00:00 AM
。净小提琴
我的意图是"1,5">不是被视为有效的DateTime。很明显,我错了。
我已经在。net Framework 4.8和。net Core 5中尝试了相同的结果。
查看了DateTime.TryParse
方法的. net源代码后,我仍然不明白为什么这被认为是一个有效的日期。
另外,我希望以某种方式阻止方法将此识别为有效日期。我的猜测是DateTime.TryParseExact
,但也许有更好的选择。
我的问题
- 为什么不变文化中的
DateTime.TryParse
考虑"1,5"作为有效日期。 - 如何防止这种行为?
它解析为"月,日"在当年-这就是为什么它允许。
DateTime.TryParse()
是出了名的宽容——建议通常使用DayTime.TryParseExact()
来避免这样的事情(正如你自己建议的那样)。
没有比使用DateTime.TryParseExact()
更好的方法来解决这个问题。
这个行为实际上是有文档记录的:
此方法尝试忽略无法识别的数据,如果可能的话,并填充在缺少月、日、年信息与当前日期。如果s只包含日期而不包含时间,则此方法假定时间为午夜12:00
解析月份和日期,然后将年份设置为当前日期的年份,时间设置为午夜。