4

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

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 PM 没有抛出异常,DateTime.Parse 很乐意将其转换为错误的日期。

为了完成这项工作,我正在使用DateTime.ParseExact(userInput,"yyyy-MM-dd",currentCulture).

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

4

1 回答 1

4

ISO8601 中唯一+的时间偏移部分,在这种情况下看起来是这样解析的。但据我所知,在允许时间偏移之前,日期的所有 3 个部分都需要具有有效值。

我建议使用DateTime.ParseExact(userInput,"yyyy-MM-dd",...(甚至可能使用InvariantCulture)。

DateTime.Parse接受各种各样的输入,并试图对用户的意图做出最好的猜测。当它只是以令人困惑的方式猜测时,这感觉就像一个案例。

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

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

这似乎Parse本质上"YYYY-MM+0x"被视为"YYYY-MM-01T00:00+0x".

于 2012-11-14T16:59:30.513 回答