DateTime.TryParse(明确地)识别哪些格式

本文关键字:识别 格式 TryParse DateTime | 更新日期: 2023-09-27 18:01:14

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

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

然而,我如何知道它目前和/或将来是否会承认以下内容?

  • 2014年5月13日
  • 2014年5月13日
  • 2014年5月13日
  • 2014年5月13日
  • 2014年5月13日

(不是详尽的列表,只是几个例子)

我已经查看了该方法的源代码,但通过逆向工程从核心.NET方法中找出预期结果似乎并不正确。

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

DateTime.TryParse(明确地)识别哪些格式

来自MSDN文档中的DateTime.Parse:

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

  • 包含日期和时间成分的字符串。

  • 包含日期但不包含时间成分的字符串。如果没有时间组件,则该方法假定为午夜12:00。如果日期组件具有两位数的年份,则会根据当前区域性的当前日历或指定区域性的现有日历的Calendar.TwoDigitYearMax将其转换为年份(如果使用带有非null提供程序参数的重载)。

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

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

    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是parse-的包装器,但实际上,情况正好相反。CCD_ 13封装CCD_ 14并在接收到CCD_ 15时抛出异常。来源于此。

当这些文档提到"日期组件"或"时间组件"时,它们具体指的是传递给IFormatProvider参数的DateTimeFormatInfo对象提供的格式之一,或者从传递的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时,从该方法返回的任何格式模式中的任何字符串都将被视为有效。

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

我想你正在寻找这个

DateTime.GetDateTime格式

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,但没有解析。

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

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

请注意,使用区域性敏感度可以将应用程序部署到世界上的任何区域性/地区,如果他们以该区域性所需的格式输入日期,则可以"通用解析"。目标是允许您能够处理来自多种文化的输入,而不是专门针对特定文化和格式的代码(就像您在这里可能做的那样)。