为什么 DateTime.TryParse 认为"1,5"有效(以及如何防止)?



当尝试验证用户输入时,输入字符串"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,但也许有更好的选择。

我的问题

  1. 为什么不变文化中的DateTime.TryParse考虑"1,5"作为有效日期。
  2. 如何防止这种行为?

它解析为"月,日"在当年-这就是为什么它允许。

DateTime.TryParse()是出了名的宽容——建议通常使用DayTime.TryParseExact()来避免这样的事情(正如你自己建议的那样)。

没有比使用DateTime.TryParseExact()更好的方法来解决这个问题。

这个行为实际上是有文档记录的:

此方法尝试忽略无法识别的数据,如果可能的话,并填充在缺少月、日、年信息与当前日期。如果s只包含日期而不包含时间,则此方法假定时间为午夜12:00

解析月份和日期,然后将年份设置为当前日期的年份,时间设置为午夜。

相关内容

最新更新