相同格式解析DateTime时不一致

问题描述 投票:0回答:2

我有以下字符串:

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

如您所见,第二个日期未正确解析,即使其格式相同。这是什么原因,我该如何解决?

c# datetime
2个回答
3
投票

正如您所看到的,即使格式相同,第二个日期也未正确解析。

这是我的两美分

编程语言和框架不够聪明,无法知道您应用了哪种格式数据,特别是日期、时间、数字等。如果您提供这些数据,您也必须提供正确的格式,以便他们可以做好自己的工作。您“说了”相同的格式,但没有在代码中应用任何格式。所以,作为人类,我们知道(至少你告诉我们)但计算机不知道。

让我们看看

TryParse(String, IFormatProvider, DateTimeStyles, DateTime)

文档
说了什么;

将日期和时间的指定字符串表示形式转换为其 使用

指定的区域性特定格式的日期时间等效项 information 和格式化样式,并返回一个指示的值 是否转换成功。

您没有提供您提供的格式信息

IFormatProvider

 作为 InvariantCulture
。那么,这些“文化特定格式”是什么?

好吧,其中大多数都是使用

GetAllDateTimePatterns

 方法返回的(但不是全部),但要注意,因为文档说;

您可以在返回的数组中使用自定义格式字符串
格式化操作中的

GetAllDateTimePatterns
方法。然而,如果 你这样做,在该格式化操作中返回的日期和时间值的字符串表示形式

不能总是被成功解析

ParseTryParse
 方法。因此,您不能假设
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
(即
1/1/0001 12:00:00 AM
)。如果 s 则转换失败 参数为
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”格式,因此它会为您提供输出。
也许尝试将日期格式输入更改为 

1
投票

	

© www.soinside.com 2019 - 2024. All rights reserved.