2009-09-03 83 views
1

为Date.TryParse方法签名为:Date.TryParseExact - 提供者参数的用途是什么?

Public Shared Function TryParseExact (_ 
    s As String, _ 
    format As String, _ 
    provider As IFormatProvider, _ 
    style As DateTimeStyles, _ 
    <OutAttribute> ByRef result As DateTime _ 
) As Boolean 

我明白做什么格式,但什么是供应商参数?我知道你传入一个CultureInfo实例,但我不确定它的目的是什么。

任何人都可以请赐我吗?

回答

8

提供程序指定关于日期的文化特定格式信息。

例如,你可以通过在这些文化:

new CultureInfo("en-US") // USA 
new CultureInfo("fr-FR") // France 
new CultureInfo("it-IT") // Italy 
new CultureInfo("de-DE") // Germany 

并根据这些文化,你会得到的日期格式,如:

  • EN-US:6/1/2009下午4点37分00秒
  • FR-FR:01/06/2009十六点37分00秒
  • 它-IT:01/06/2009 16.37.00
  • DE-DE:01.06。 2009年16点37分00秒

又如:使用 “d” 格式,使用的en-US用于CultureInfo的当其表示M/d/yyyy的短日期模式,考虑:

DateTime dateValue; 
string[] sampleDates = new[] { "31/8/2009", "8/31/2009" }; 
foreach (string currentDate in sampleDates) 
{ 
    bool result = DateTime.TryParseExact(currentDate, new[] {"d"}, 
        new CultureInfo("en-US"), 
        DateTimeStyles.None, 
        out dateValue); 
    Console.WriteLine("{0}: {1}", currentDate, result ? "valid" : "invalid"); 
    if (result) 
    { 
     Console.WriteLine("Result: {0}", dateValue); 
    } 
    Console.WriteLine(); 
} 

输出:

31/8/2009: invalid 

8/31/2009: valid 
Result: 8/31/2009 12:00:00 AM 

31/8/2009是无效的,因为它不适合M/d/YYYY的EN-US区域性的格式,而2009/8/31是有效的,因为它的作用。

1

IFormatProvider是一个知道如何格式化某些东西的类。 TryParseExact需要询问它(在这种情况下,具体为CultureInfo),以查看字符串中是否存在任何特定文化特定符号,例如星期几,AM/PM等。

此外,如果您只需将格式作为标准c#日期格式说明符之一传递,则格式提供程序必须咨询给定文化的具体内容。

+0

我明白了。我的印象是IFormatProvider参数是一种“后备”格式匹配器,以防您传入的格式字符串不能完成这项工作。 说我尽量做到: TryParseExact( “18/06/2009”, “DDMMYYYY”,新的CultureInfo( “EN-AU”,DateTimeStyles.None,stringToWriteTo) 然后TryParseExact将返回false,没有什么会写入stringToWriteTo? – Andrew 2009-09-03 06:45:26

0

世界各地的日期不尽相同,无论是格式还是数月使用的文字。 IFormatProviders知道这一点。