首页 > 解决方案 > DateTime.TryParseExact 忽略 DateTimeStyles.NoCurrentDateDefault

问题描述

当格式字符串不提供月份和年份,而只提供时间和日期时,我正在尝试解析 DateTime。所以我的假设是,在下面的调用之后,月份和年份将设置为 01 和 0001。但是,结果显示月份设置为 01,年份设置为 2021 年。

DateTime.TryParseExact("5 11:20", "d HH:mm", CultureInfo.InvariantCulture, DateTimeStyles.NoCurrentDateDefault, out dateTime);

返回:01/05/2021 11:20:00

当我删除日期格式时,它似乎有效:

DateTime.TryParseExact("11:20", "HH:mm", CultureInfo.InvariantCulture, DateTimeStyles.NoCurrentDateDefault, out dateTime);

代码可以在这里运行:https ://dotnetfiddle.net/YADrwn

知道为什么会这样吗?

标签: c#datetime

解决方案


在参考源中,我们可以看到bTimeOnly如果您有几天、几个月或几年的时间,则有一个计算标志为假。

TryParseExact 的私有函数调用: https ://referencesource.microsoft.com/#mscorlib/system/globalization/datetimeparse.cs,2558c4cbd566081b

检查它是否只是时间或日期的时刻: https ://referencesource.microsoft.com/#mscorlib/system/globalization/datetimeparse.cs,4134

假设只有一天 = 当年、第一个月和读取日期的时刻: https ://referencesource.microsoft.com/#mscorlib/system/globalization/datetimeparse.cs,ed47be441811082c

所以,这正是你的行为。似乎是有意的。

无论如何,您可以使用 获取时间部分dateTime.TimeOfDay


推荐阅读