c# - 为什么 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”不被视为有效的日期时间。显然,我错了。
我在 .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
所以它会解析月份和日期,然后将年份设置为当前日期的年份,并将时间设置为午夜。
推荐阅读
- android - 如何从 RecyclerView 项目中将两组数据保存在 Room 数据库中
- jquery - 如何在单击按钮同时选择两个下拉选项时显示隐藏 div
- php - 即使条件错误,Laravel Eloquent 模型也会返回值
- r - 为什么偏差表分析的 p 值与 pchisq() 估计的不同?
- android - JobService 在调用 FirebaseJobDispatcher.cancel() 后不会停止
- java - 在测试中的 Spring Environment 中使用带有 spring.profiles.active 属性的 @EnabledIf
- javascript - 有没有办法比较不同数组之间的字符串?
- swift - Linux swift 项目中的 PromiseKit 无法按预期工作
- docker - 错误:服务“api-gateway”构建失败:添加失败:stat /var/lib/docker/tmp/docker-builder931060141/api-gateway:没有这样的文件或目录
- python - 当配置文件已经创建并保存时,为什么我们必须保存配置文件的实例?