我有以下字符串:
10/10/2021 00:00:00
和 18/11/2021 23:59:59
我有这个代码:
bool first = DateTime.TryParse("10/10/2021 00:00:00",
CultureInfo.InvariantCulture,
DateTimeStyles.None,
out DateTime firstDate);
bool second = DateTime.TryParse("18/11/2021 23:59:59",
CultureInfo.InvariantCulture,
DateTimeStyles.None,
out DateTime secondDate);
Console.WriteLine(firstDate + " --- " + secondDate);
输出为:
10/10/2021 12:00:00 AM --- 1/1/0001 12:00:00 AM
如您所见,第二个日期未正确解析,即使其格式相同。这是什么原因,我该如何解决?
正如您所看到的,即使格式相同,第二个日期也未正确解析。
这是我的两美分。
编程语言和框架不够聪明,无法知道您应用了哪种格式数据,特别是日期、时间、数字等。如果您提供这些数据,您也必须提供正确的格式,以便他们可以做好自己的工作。您“说了”相同的格式,但没有在代码中应用任何格式。所以,作为人类,我们知道(至少你告诉我们)但计算机不知道。
让我们看看TryParse(String, IFormatProvider, DateTimeStyles, DateTime)
文档说了什么;
将日期和时间的指定字符串表示形式转换为其 使用您没有提供您提供的格式信息 作为指定的区域性特定格式的日期时间等效项 information 和格式化样式,并返回一个指示的值 是否转换成功。
InvariantCulture
。那么,这些“文化特定格式”是什么?
好吧,其中大多数都是使用 方法返回的(但不是全部),但要注意,因为文档说;
您可以在返回的数组中使用自定义格式字符串
格式化操作中的GetAllDateTimePatterns
方法。然而,如果 你这样做,在该格式化操作中返回的日期和时间值的字符串表示形式不能总是被成功解析
Parse
和TryParse
方法。因此,您不能假设GetAllDateTimePatterns
方法返回的自定义格式字符串 可用于往返日期和时间值。所以,如果你跑步;
CultureInfo.InvariantCulture.DateTimeFormat.GetAllDateTimePatterns().Dump();
顺便说一句,
*Dump
只是LINQPad
的扩展方法,它只是输出到控制台。您将获得很多日期时间模式,但对于我们的情况,重要的是我们获得
MM/dd/yyyy HH:mm:ss
的 InvariantCulture
格式。
如您所见,您的
18/11/2021 23:59:59
数据与MM/dd/yyyy HH:mm:ss
格式不匹配,因为公历
上没有第18个月,这是内部属于
DateTime
实例的。
顺便说一句,你的第二次解析失败,这与仅仅说“第二个日期未正确解析”完全不同,这就是
DateTime.TryParse
方法的工作原理,如文档中所述;当此方法返回时,包含相当于的
DateTime
值 s 中包含的日期和时间(如果转换成功),或者 如果转换失败,则为(即MinValue
)。如果 s 则转换失败 参数为1/1/0001 12:00:00 AM
null
,为空字符串 (""
),或不包含 日期和时间的有效字符串表示形式。因此,处理此问题的最佳方法是使用
DateTime.TryParseExact
bool first = DateTime.TryParseExact("10/10/2021 00:00:00",
"dd/MM/yyyy HH:mm:ss",
CultureInfo.InvariantCulture,
DateTimeStyles.None,
out DateTime firstDate);
bool second = DateTime.TryParseExact("18/11/2021 23:59:59",
"dd/MM/yyyy HH:mm:ss",
CultureInfo.InvariantCulture,
DateTimeStyles.None,
out DateTime secondDate);
默认的日期时间格式是“MM/dd/yyyy”,由于您的日期采用“dd/MM/yyyy”格式,因此它会为您提供输出。
也许尝试将日期格式输入更改为