这是一个场景。
示例:
实现:
CultureInfo.DateTimeFormat.GetAllDateTimePatterns()
DateTime.TryParseExact(dateString, pattern, culture, DateTimeStyles.None, out resultingDate)
,看看它是否可以解析日期。HOWEVER 如果我们迭代所有这些模式,它将找不到任何匹配项!
如果您尝试使用DateTime.TryParse(dateString, culture, DateTimeStyles.None, out resultingDate)
并且 DOES 解析正确的日期,则更为奇怪!
所以问题是DateTime.TryParse
如何知道日期字符串的模式,当此信息不是CultureInfo
的一部分以及如何在文化中获取此信息时?
谢谢!
答案 0 :(得分:2)
我同意xanatos,没有完美的解决方案,而无法假设每个格式{{1使用GetAllDateTimePatterns
或Parse
方法可以完美地解析返回值。
来自DateTimeFormatInfo.GetAllDateTimePatterns
;
您可以在由...返回的数组中使用自定义格式字符串 格式化操作中的
TryParse
方法。但是,如果 你这样做,返回的日期和时间值的字符串表示形式 格式化操作无法始终成功解析GetAllDateTimePatterns
和Parse
方法。因此,你不能认为了TryParse
方法返回的自定义格式字符串 可用于往返日期和时间值。
如果您在页面上看到Remarks
section,GetAllDateTimePatterns
方法只能采用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将数据从一个国家发送到另一个国家,并想知道为什么他们的供应商无法读取它; - )