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

C# DateTime.TryParse如何知道日期格式?,c#,.net,date,parsing,datetime,C#,.net,Date,Parsing,Datetime,下面是一个场景 您有一个表示日期的字符串,即“2016年1月25日上午10:10” 您想知道它是否代表特定区域性中的日期 您想知道什么dateTime模式满足此日期字符串 例如: 日期字符串为“2016年1月25日上午10:10” 文化是我们的精神支柱 它的可能格式可以是“MMM dd yyyy HH:mm tt” 实施: 要获取所有dateTime模式的列表,可以获取CultureInfo.DateTimeFormat.GetAllDateTimePatterns() 然后为上面的每

下面是一个场景

  • 您有一个表示日期的字符串,即“2016年1月25日上午10:10”
  • 您想知道它是否代表特定区域性中的日期
  • 您想知道什么dateTime模式满足此日期字符串
例如:

  • 日期字符串为“2016年1月25日上午10:10”
  • 文化是我们的精神支柱
  • 它的可能格式可以是“MMM dd yyyy HH:mm tt”
实施:

  • 要获取所有dateTime模式的列表,可以获取
    CultureInfo.DateTimeFormat.GetAllDateTimePatterns()
  • 然后为上面的每个模式尝试重载版本的
    DateTime.TryParseExact(dateString,pattern,culture,DateTimeStyles.None,out resultingDate)
    ,看看它是否能解析日期
  • 这将为您提供所需的日期时间模式
但是如果我们迭代所有这些模式,它将找不到任何匹配

如果您尝试使用
DateTime.TryParse(dateString,culture,DateTimeStyles.None,out resultingDate)
,它会解析正确的日期,这就更奇怪了

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


谢谢

我同意xanatos的观点,没有完美的解决方案,你不能假设每种格式
GetAllDateTimePatterns
返回都可以通过
Parse
TryParse
方法完美解析

来自

可以在由返回的数组中使用自定义格式字符串 格式化操作中的方法。然而,如果 如果是,则返回的日期和时间值的字符串表示形式为 该格式化操作不能总是由
Parse
TryParse
方法。因此,您不能假定
GetAllDateTimePatterns
方法返回的自定义格式字符串 可用于确定往返日期和时间值

如果您在页面上看到,例如
TryParse
方法返回的
it
区域性的96种格式中,只有42种格式可以被
TryParse
方法解析。7

塔里克·马哈茂德·赛义德回答说:

Parse/TryParse被实现为有限状态机,因此它不会 在解析中真正使用日期模式。它只是将解析的 将字符串转换为标记,并尝试查找标记是否与的特定部分匹配 日期(如月、日、星期几等)。另一方面 ParseExact/TryParseExact将根据 传递的格式模式


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

我在一篇博客文章中对此进行了一些讨论(见下)

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

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

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


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

代码如下:嗯……问题是你在TryParseExact中使用的模式。你应该尝试所有可能的模式,我认为你正在尝试的是不可能的。想想这个日期:
01/02/2016
。它可以是
dd/MM/yyyy
MM/dd/yyyy
。如果不了解文化,怎么知道是哪一个呢???很有趣。。。en-us没有
MMM-dd-yyyy
格式。请不要忘记区域设置生成器工具:),这样en-us就可以拥有您想要的任何模式!一些地区允许有趣的格式作为替代格式,比如yyyy/MM/dd,因为它本身就有点明确,但是如果它是列表中的最后一种模式,您会怎么做呢?我向.NET团队发送了一封电子邮件,说明这种情况,并查看获得这些格式的最佳方式(或是否有任何方式)。当他们返回我时,我会更新我的答案。