【问题标题】:DateTime.Parse with the "+" symbolDateTime.Parse 带有“+”符号
【发布时间】:2012-11-14 16:50:48
【问题描述】:

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

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 标准中的某些内容?

【问题讨论】:

  • 你希望 '1900-01+01' 解析成什么?你是说这是一个有效的日期?
  • 可以在解析日期时间前将+替换为-
  • 最好进行一些客户端和服务器端验证以验证您的日期是否为“yyyy-MM-dd”格式,否则会显示错误。
  • 不,我并不是说这是一个有效的日期,恰恰相反。它不应该解析,但它正在解析为一个日期。
  • 啊,在这种情况下,您需要在通过任何解析算法之前验证您的用户输入。

标签: c# .net datetime iso8601


【解决方案1】:

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"

【讨论】:

  • 是的,我目前正在使用带有文化的 ParseExact,并且很快将使用 TryParseExact 来删除有问题的 try-catch(老实说,这是别人的代码味道)。关于最佳拟合/猜测的要点。
  • 它+表示时间偏移(我也是第一个想法)日期不应该变大吗?时间倒退 6 小时。
  • @Blah_Blah,偏移量来自 UTC,我已将示例值作为答案,希望能消除一些混乱。 IE。您的时区偏移量是“+06”,而我的时区偏移量是“-08” - 所以Parse("1900-02") 会得到非常不同的结果。
  • 是的,我自己刚到那里,幸运的是我先刷新了。将 ParseExact 添加到最佳实践列表中...
猜你喜欢
  • 1970-01-01
  • 2017-02-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多