2012-07-25 192 views
0

只是好奇... 所以我得到,如果我将日期的字符串版本转换为DateTime对象,并将其传递到String.Format()方法,然后我“会得到想要的结果。格式化字符串日期与String.Format()

String.Format("The date is {0:MMMM dd, yyyy}", DateTime.Parse("05-22-2012")); 

“的日期是2012年5月22日”

但是,为什么不这项工作?

String.Format("The date is {0:MMMM dd, yyyy}", "05-22-2012") 

“的日期是05-22-2012 “

很抱歉,如果这是一个愚蠢的问题,但我只是想了解如何工作的。 感谢

回答

3

其他这里的答案触及了显着的poi NTS,但让我们把它们放在一起的研究如何String.Format作品。

它有五个重载,但我们只谈谈它们都重定向到的一个(这不是实际的代码,如果你想用Reflector或ILSpy查看它,你会发现它在StringBuilder.AppendFormat )。为了便于理解,这被简化了。

public static string Format(IFormatProvider provider, string format, params object[] args) 
{ 
    StringBuilder sb = new StringBuilder(); 

    // Break up the format string into an array of tokens 
    Token[] tokens = ParseFormatString(format); 

    foreach (Token token in tokens) 
    { 
     switch (token.TokenType) 
     { 
      // A Text token is just some text to output directly 
      case TokenType.Text: 
       sb.Append(token.Text); 
       break; 

      // An Index token represents something like {0} or {2:format} 
      // token.Index is the argument index 
      // token.FormatText is the format string inside ('' in the first example, 'format' in the second example) 
      case TokenType.Index: 
       { 
        object arg = args[token.Index]; 

        IFormattable formattable = arg as IFormattable; 
        if (formattable != null && token.FormatText.Length > 0) 
        { 
         // If the argument is IFormattable we pass it the format string specified with the index 
         sb.Append(formattable.ToString(token.FormatText, provider)); 
        } 
        else 
        { 
         // Otherwise we just use Object.ToString 
         sb.Append(arg.ToString()); 
        } 
       } 
       break; 
     } 
    } 

    return sb.ToString(); 
} 

在你的问题中,你问为什么格式字符串不适用,当你通过“05-22-2012”。正如Guffa所说,这不是一个DateTime对象,它是一个String对象。

正如GSerjo说,一个字符串不是IFormattable。字符串不是格式化的,因为格式化是将某些东西转换为字符串的过程。一个字符串已经是一个字符串!

所以你可以看到,当Format方法进入索引器时,arg将不会IFormattable,它将简单地调用ToString。对字符串调用ToString只是返回自己,它已经是一个字符串了。总之,如果你的格式字符串包含一个带有内格式字符串(例如{0:格式})的索引,那么只有当相关参数是IFormattable并且它知道该做什么时才应用该内格式字符串用你给它的格式字符串。

+0

这真的给我带来了很好的解释。谢谢! – Dmase05 2012-07-26 02:17:30

2

自定义日期时间格式只能在一个DateTime值。如果您使用的是字符串,则该格式将被忽略,因为只有一种方法可以输出字符串。

+0

绝对有意义,谢谢 – Dmase05 2012-07-26 02:13:19