首页 > 解决方案 > 为什么 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

.NET 小提琴

我的意图是“1,5”被视为有效的日期时间。显然,我错了。

我在 .NET Framework 4.8 和 .NET Core 5 中都尝试过,结果相同。

DateTime.TryParse浏览了该方法的 .NET 源代码后,我仍然无法弄清楚为什么这被视为有效日期。

此外,我希望以某种方式阻止将其识别为有效日期的方法。我的猜测是去,DateTime.TryParseExact但也许有更好的选择。

我的问题

  1. 为什么DateTime.TryParse在不变文化中将“1,5”视为有效日期。
  2. 如何防止这种行为?

标签: c#.netdatetime

解决方案


它将它解析为当年的“月,日”——这就是它允许它的原因。

DateTime.TryParse()是出了名的宽容-建议通常用于DayTime.TryParseExact()避免此类事情(正如您自己建议的那样)。

没有比使用DateTime.TryParseExact().

这种行为实际上已记录在案

如果可能,此方法会尝试忽略无法识别的数据,并使用当前日期填充缺失的月、日和年信息。如果 s 仅包含日期而没有时间,则此方法假定时间为午夜 12:00

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


推荐阅读