DateTime.TryParse识别哪些格式(显式)?

时间:2014-05-01 14:25:53

标签: c# .net datetime

我指的是DateTime.TryParse(string s, out DateTime result)重载,它尝试从字符串中解析DateTime - 没有指定特定的格式。

我可以从http://msdn.microsoft.com/en-us/library/ch92fbc1(v=vs.110).aspx看到该方法使用DateTimeFormatInfo(从控制面板设置派生),并且不需要这些时间等。

但是,我如何知道它目前和/或将来是否会识别,例如,以下内容?

  • 13可能 - 14
  • 13可能 - 2014
  • 13/05/2014
  • 13-05-2014
  • 13 May 14

(不是详尽的清单,只是几个例子)

我已经查看了该方法的来源,但逆向工程以找出核心.NET方法的预期结果似乎并不合适。

我可以从文档中看到" ...因为DateTime.TryParse(String,DateTime)方法尝试使用当前文化的格式规则解析日期和时间的字符串表示形式..." - 在MSDN中是否有其他位置列出了有效的潜在表示,或者哪个类定义了它们

3 个答案:

答案 0 :(得分:3)

From the MSDN documentation for DateTime.Parse

  

要解析的字符串可以采用以下任何一种形式:

     
      
  • 包含日期和时间组件的字符串。

  •   
  • 包含日期但没有时间组件的字符串。如果时间组件不存在,则该方法假定午夜12点。如果日期组件具有两位数的年份,则会根据当前区域性当前日历的Calendar.TwoDigitYearMax或指定区域性的当前日历(如果使用带有非null 提供者参数)。

  •   
  • 包含时间但没有日期组件的字符串。该方法采用当前日期,除非您调用Parse(String, IFormatProvider, DateTimeStyles)重载并在 styles 参数中包含DateTimeStyles.NoCurrentDateDefault,在这种情况下,该方法假设为0001年1月1日。

  •   
  • 包含时区信息并符合ISO 8601的字符串。在以下示例中,第一个字符串指定协调世界时(UTC),第二个字符串指定7小时前的时区中的时间比UTC:

         
    2008-11-01T19:35:00.0000000Z 
    2008-11-01T19:35:00.0000000-07:00
    
  •   
  • 包含GMT指示符并符合RFC 1123时间格式的字符串;例如:

         
    Sat, 01 Nov 2008 19:35:00 GMT
    
  •   
  • 包含日期和时间以及时区偏移信息的字符串;例如:

         
    03/01/2009 05:42:00 -5:00
    
  •   

虽然这些文档是为Parse编写的,但它们也适用于TryParse。由于DateTime.Parse的文档有更多详细信息,因此您可能认为Parse是主要方法,而TryParse是解析器的包装器 - 但实际上,逆是真的< / em>的。 Parse包裹TryParse并在收到false时抛出异常。 Source here

当这些文档引用“日期组件”或“时间组件”时,它们专门讨论传递给DateTimeFormatInfo参数的IFormatProvider对象提供的格式之一 - 或者来自CultureInfo传递的,或者来自CurrentCulture(如果没有提供)。

如果您想了解特定DateTimeFormatInfo对象的所有格式,则可以使用DateTimeFormatInfo.GetAllDateTimePatterns。例如:

string[] p = CultureInfo.CurrentCulture.DateTimeFormat.GetAllDateTimePatterns();

作为具体示例,请考虑:

var dtfi = CultureInfo.CreateSpecificCulture("en-GB").DateTimeFormat;
foreach (string pattern in dtfi.GetAllDateTimePatterns())
{
    Debug.WriteLine(pattern);
}

其中输出以下内容:

dd/MM/yyyy
dd/MM/yy
d/M/yy
d.M.yy
yyyy-MM-dd
dd MMMM yyyy
d MMMM yyyy
dddd, d MMMM yyyy
dddd, dd MMMM yyyy
dd MMMM yyyy HH:mm
dd MMMM yyyy H:mm
dd MMMM yyyy hh:mm tt
dd MMMM yyyy h:mm tt
d MMMM yyyy HH:mm
d MMMM yyyy H:mm
d MMMM yyyy hh:mm tt
d MMMM yyyy h:mm tt
dddd, d MMMM yyyy HH:mm
dddd, d MMMM yyyy H:mm
dddd, d MMMM yyyy hh:mm tt
dddd, d MMMM yyyy h:mm tt
dddd, dd MMMM yyyy HH:mm
dddd, dd MMMM yyyy H:mm
dddd, dd MMMM yyyy hh:mm tt
dddd, dd MMMM yyyy h:mm tt
dd MMMM yyyy HH:mm:ss
dd MMMM yyyy H:mm:ss
dd MMMM yyyy hh:mm:ss tt
dd MMMM yyyy h:mm:ss tt
d MMMM yyyy HH:mm:ss
d MMMM yyyy H:mm:ss
d MMMM yyyy hh:mm:ss tt
d MMMM yyyy h:mm:ss tt
dddd, d MMMM yyyy HH:mm:ss
dddd, d MMMM yyyy H:mm:ss
dddd, d MMMM yyyy hh:mm:ss tt
dddd, d MMMM yyyy h:mm:ss tt
dddd, dd MMMM yyyy HH:mm:ss
dddd, dd MMMM yyyy H:mm:ss
dddd, dd MMMM yyyy hh:mm:ss tt
dddd, dd MMMM yyyy h:mm:ss tt
dd/MM/yyyy HH:mm
dd/MM/yyyy H:mm
dd/MM/yyyy hh:mm tt
dd/MM/yyyy h:mm tt
dd/MM/yy HH:mm
dd/MM/yy H:mm
dd/MM/yy hh:mm tt
dd/MM/yy h:mm tt
d/M/yy HH:mm
d/M/yy H:mm
d/M/yy hh:mm tt
d/M/yy h:mm tt
d.M.yy HH:mm
d.M.yy H:mm
d.M.yy hh:mm tt
d.M.yy h:mm tt
yyyy-MM-dd HH:mm
yyyy-MM-dd H:mm
yyyy-MM-dd hh:mm tt
yyyy-MM-dd h:mm tt
dd/MM/yyyy HH:mm:ss
dd/MM/yyyy H:mm:ss
dd/MM/yyyy hh:mm:ss tt
dd/MM/yyyy h:mm:ss tt
dd/MM/yy HH:mm:ss
dd/MM/yy H:mm:ss
dd/MM/yy hh:mm:ss tt
dd/MM/yy h:mm:ss tt
d/M/yy HH:mm:ss
d/M/yy H:mm:ss
d/M/yy hh:mm:ss tt
d/M/yy h:mm:ss tt
d.M.yy HH:mm:ss
d.M.yy H:mm:ss
d.M.yy hh:mm:ss tt
d.M.yy h:mm:ss tt
yyyy-MM-dd HH:mm:ss
yyyy-MM-dd H:mm:ss
yyyy-MM-dd hh:mm:ss tt
yyyy-MM-dd h:mm:ss tt
d MMMM
d MMMM
yyyy'-'MM'-'dd'T'HH':'mm':'ss.fffffffK
yyyy'-'MM'-'dd'T'HH':'mm':'ss.fffffffK
ddd, dd MMM yyyy HH':'mm':'ss 'GMT'
ddd, dd MMM yyyy HH':'mm':'ss 'GMT'
yyyy'-'MM'-'dd'T'HH':'mm':'ss
HH:mm
H:mm
hh:mm tt
h:mm tt
HH:mm:ss
H:mm:ss
hh:mm:ss tt
h:mm:ss tt
yyyy'-'MM'-'dd HH':'mm':'ss'Z'
dd MMMM yyyy HH:mm:ss
dd MMMM yyyy H:mm:ss
dd MMMM yyyy hh:mm:ss tt
dd MMMM yyyy h:mm:ss tt
d MMMM yyyy HH:mm:ss
d MMMM yyyy H:mm:ss
d MMMM yyyy hh:mm:ss tt
d MMMM yyyy h:mm:ss tt
dddd, d MMMM yyyy HH:mm:ss
dddd, d MMMM yyyy H:mm:ss
dddd, d MMMM yyyy hh:mm:ss tt
dddd, d MMMM yyyy h:mm:ss tt
dddd, dd MMMM yyyy HH:mm:ss
dddd, dd MMMM yyyy H:mm:ss
dddd, dd MMMM yyyy hh:mm:ss tt
dddd, dd MMMM yyyy h:mm:ss tt
MMMM yyyy
MMMM yyyy

理想情况下,使用DateTime.ParseDateTime.TryParse时,此方法返回的任何格式模式中的任何字符串都将被视为有效。

HOWEVER - 正如Blam在评论中指出的那样,并非所有可能的格式都会正确解析。问题很简单,并非所有格式都可以为每个值进行往返。例如,en-US文化同时具有MM/dd/yyyy/MM/dd格式。如果我解析14/05/01,你会认为它会识别14年,因为它太大而不是一个月而且使用yy/MM/dd格式。但实际上,它会看到由斜线分隔的三个两位数字,因此选择匹配的第一个条目,即MM/dd/yy。然后由于14不适合MM,解析失败并且TryParse返回false。

答案 1 :(得分:2)

我认为你正在寻找这个

DateTime.GetDateTimeFormats

DateTime july28 = new DateTime(2009, 7, 28, 5, 23, 15, 16);

string[] july28Formats = july28.GetDateTimeFormats();

// Print out july28 in all DateTime formats using the default culture.
foreach (string format in july28Formats) {
    Console.WriteLine(format);
}

在现实生活中记录任何失败的TryParse的值,如果你需要知道哪些值失败

不能发布,因为它属于我的公司,但我编写了一个程序,从文本中提取日期,然后解析日期。我写了正则表达式来提取任何EN或FR模式的日期。有些日期对我来说是有效的GetAllDateTimePatterns,它没有解析。

答案 2 :(得分:-1)

我能找到的最近的东西是:

http://www.basicdatepicker.com/samples/cultureinfo.aspx

请注意,使用了文化敏感度,以便您可以将应用程序部署到世界上的任何文化/区域,如果他们以该文化所期望的格式输入日期,则可以是普遍的#34;解析的&#34 ;.目标是让您能够处理来自多种文化的输入,而不是针对特定文化和格式的代码(正如您可能在此处所做的那样)。