C# DateTime.Parse中的+&引用;符号

C# DateTime.Parse中的+&引用;符号,c#,.net,datetime,iso8601,C#,.net,Datetime,Iso8601,我有一段代码可以解析和验证用户输入: DateTime myDateTime = DateTime.Parse(userInput,currentCulture); 正在设置当前区域性(en ca或fr ca),用户输入始终为ISO 8601格式“yyyy MM dd” 如果用户输入1900-01-01,则按预期创建日期如果输入为“1900-01+01”,则创建的日期时间为1899-12-31下午6:00:00不会引发异常,DateTime.Parse会将其转换为错误的日期 为了实现这一点,我

我有一段代码可以解析和验证用户输入:

DateTime myDateTime = DateTime.Parse(userInput,currentCulture);
正在设置当前区域性(en ca或fr ca),用户输入始终为ISO 8601格式“yyyy MM dd”

如果用户输入1900-01-01,则按预期创建日期如果输入为“1900-01+01”,则创建的日期时间为1899-12-31下午6:00:00不会引发异常,DateTime.Parse会将其转换为错误的日期

为了实现这一点,我使用了
DateTime.ParseExact(userInput,“yyyy-MM-dd”,currentCulture)


所以我的问题不是如何使这个工作(我有那个),而是+01或任何+value怎么了?我在ISO标准中遗漏了什么吗?

ISO8601中唯一的
+
是时间偏移部分,在本例中,它看起来是这样解析的。但据我所知,在允许时间偏移之前,日期的所有3个部分都必须具有有效值

我建议使用
DateTime.ParseExact(用户输入,“yyyy-MM-dd”…
(甚至可以使用
InvariantCulture

DateTime.Parse
接受各种各样的输入,并尝试对用户的意图进行最佳猜测。这就像是一种简单的猜测方式

样本值(第一个本地PDT,另外两个带有显式时间偏移):


这似乎是
Parse
本质上将
“YYYY-MM+0x”
视为
“yyy-MM-01T00:00+0x”

您希望“1900-01+01”解析为什么?您是说这是一个有效的日期吗?您可以在解析日期时间之前将
+
替换为
-
。如果您进行一些客户端和服务器端验证,以验证您的日期是否为格式“yyyy-MM-dd”,这可能是最好的选择否则显示一个错误。不,我不是说它是一个有效的日期,恰恰相反。它不应该解析,但它正在解析到一个日期。啊,在这种情况下,你需要的是在通过任何解析算法之前验证你的用户输入。是的,我目前正在使用带区域性的ParseExact,并且很快将使用TryParseExact到remove令人讨厌的try-catch(老实说,这是别人的代码味道)。关于最佳匹配/猜测的观点很好。它+表示时间偏移(我的第一个想法也是)日期不是应该变大吗?它要往回走6个小时。@Blah_Blah,偏移量是UTC的,我在答案中加入了示例值,希望能消除一些混淆。例如,您的时区偏移量是“+06”,而我的是“-08”-所以我们将得到非常不同的
解析(“1900-02”)结果
。是的,我自己刚刚到达那里,幸运的是我首先点击了刷新。将ParseExact添加到最佳实践列表中。。。
DateTime.Parse("1900-02"   ).ToUniversalTime()    //  2/ 1/1900  8:00:00 AM 
DateTime.Parse("1900-02+00").ToUniversalTime()    //  2/ 1/1900 12:00:00 AM
DateTime.Parse("1900-02+03").ToUniversalTime()    //  1/31/1900  9:00:00 PM