gpt4 book ai didi

c# - 使用 String.Format() 格式化字符串日期

转载 作者:太空宇宙 更新时间:2023-11-03 18:38:38 24 4
gpt4 key购买 nike

只是好奇...所以我知道,如果我将日期的字符串版本转换为 DateTime 对象并将其传递给 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”

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

最佳答案

此处的其他答案触及要点,但让我们将它们放在一起检查一下 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:format}),则仅当相关参数为 IFormattable 时才会应用该内部格式字符串它知道如何处理您提供的格式字符串。

关于c# - 使用 String.Format() 格式化字符串日期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11659077/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com