DateTime.TryParse如何知道日期格式?

时间:2016-03-17 10:48:40

标签: c# .net date parsing datetime

这是一个场景。

  • 您有一个代表日期的字符串,即" 2016年1月25日上午10:10"。
  • 您想知道它是否代表特定文化中的日期。
  • 您想知道dateTime模式满足此日期字符串的内容。

示例:

  • 日期字符串为" 2016年1月25日上午10:10"
  • 文化是美国
  • 可能的格式可能是" MMM dd yyyy HH:mm tt"

实现:

  • 要获取所有日期时间模式的列表,您可以获得CultureInfo.DateTimeFormat.GetAllDateTimePatterns()
  • 然后针对上面的每个模式尝试重载版本的DateTime.TryParseExact(dateString, pattern, culture, DateTimeStyles.None, out resultingDate),看看它是否可以解析日期。
  • 那应该给你所需的dateTime模式。

HOWEVER 如果我们迭代所有这些模式,它将找不到任何匹配项!

如果您尝试使用DateTime.TryParse(dateString, culture, DateTimeStyles.None, out resultingDate)并且 DOES 解析正确的日期,则更为奇怪!

所以问题是DateTime.TryParse如何知道日期字符串的模式,当此信息不是CultureInfo的一部分以及如何在文化中获取此信息时?

谢谢!

2 个答案:

答案 0 :(得分:2)

我同意xanatos,没有完美的解决方案,而无法假设每个格式{{1使用GetAllDateTimePatternsParse方法可以完美地解析返回值。

来自DateTimeFormatInfo.GetAllDateTimePatterns;

  

您可以在由...返回的数组中使用自定义格式字符串   格式化操作中的TryParse方法。但是,如果   你这样做,返回的日期和时间值的字符串表示形式   格式化操作无法始终成功解析   GetAllDateTimePatternsParse方法。因此,你不能认为了   TryParse方法返回的自定义格式字符串   可用于往返日期和时间值。

如果您在页面上看到Remarks sectionGetAllDateTimePatterns方法只能采用TryParse方法解析的格式为GetAllDateTimePatterns it-IT方法为div example.7

Tarek Mahmoud Sayed作出回应;

  

Parse / TryParse是作为有限状态机实现的,所以它没有   确实在解析时使用日期模式。它只拆分解析   将字符串转换为标记并尝试查找标记是否与特定部分匹配   日期(如月,日,星期等......)。另一方面   ParseExact / TryParseExact将根据该解析字符串   通过格式模式。

答案 1 :(得分:2)

简而言之,解析真的很难,因为有很多东西可以解决它。某政府中的某些人可能会突然决定国家X应该使用D / M / Y而不是M / D / Y,或者可能有人输入用于其他格式的数据。

我在博客文章中谈到这个问题(向底部问题)https://blogs.msdn.microsoft.com/shawnste/2005/04/05/culture-data-shouldnt-be-considered-stable-except-for-invariant/

DateTime.Parse尝试根据它在指定区域性中看到的模式和分隔符来猜测输入可能是什么。不幸的是,有些文化真难以猜测。例如, 。在某些语言环境中用于时间格式,2012年12月12日的1.1.1 12.12.12也是如此?还是2001年1月1日?

ParseExact(正如其他答案所示)更可靠,因为您可以准确地告诉它您正在寻找什么 - 更好的是,您还可以告诉用户确切要输入的内容。 (希望这是人类的输入)。不幸的是,它要求用户遵循模板。

这也是为什么您遇到的大多数日期控件(尤其是在网络上)都有单独的字段,分别为月,日和日。年。

对于机器可读格式,最好以某种标准格式将其吐出,并以完全相同的格式重新读取。我们已经让客户使用CurrentCulture将数据从一个国家发送到另一个国家,并想知道为什么他们的供应商无法读取它; - )