DateTime.Now.ToString("yyyy-MM-dd")上边代码结果为:2011-08-03,其中y、M、d即为格式限定符,他们在DateTime.ToString具有限定格式意义,但在一些场合中我们希望这些字符能直接输出,即暂时取消格式限定符的作用,这就需要转义。
一、DateTime.ToString格式限定符转义
1.单个格式限定符转义
DateTime.Now.ToString("year:yyyy") //11ear:2011
DateTime.Now.ToString(@"\year:yyyy") //year:2011可见,单个格式限定符转义只需在格式限定符前加"\"即可。
2.多个格式限定符转义
DateTime.Now.ToString("date:yyyy") //3a下e:2011
DateTime.Now.ToString("'date':yyyy") //year:2011
DateTime.Now.ToString("\"date\":yyyy") //year:2011可见,将多个连续的字符放在单/双引号中可实现批量转义。
二、转义实现解析
使用Reflector查看DateTime.ToString方法,最终转到DateTimeFormat.FormatCustomized方法上,该方法相关代码片断如下:
case '\\':
{
num4 = ParseNextChar(format, i);
if (num4 < 0)
{
throw new FormatException(Environment.GetResourceString("Format_InvalidString"));
}
outputBuffer.Append((char)num4);
num2 = 2;
continue;
}
case '\'':
case '"':
{
StringBuilder result = new StringBuilder();
num2 = ParseQuoteString(format, i, result);
outputBuffer.Append(result);
continue;
}DateTimeFormat类中与上述代码相关的两个方法:
private static int ParseNextChar(string format, int pos)
{
if (pos >= (format.Length - 1))
{
return -1;
}
return format[pos + 1];
}
internal static int ParseQuoteString(string format, int pos, StringBuilder result)
{
int length = format.Length;
int num2 = pos;
char ch = format[pos++];
bool flag = false;
while (pos < length)
{
char ch2 = format[pos++];
if (ch2 == ch)
{
flag = true;
break;
}
if (ch2 == '\\')
{
if (pos >= length)
{
throw new FormatException(Environment.GetResourceString("Format_InvalidString"));
}
result.Append(format[pos++]);
}
else
{
result.Append(ch2);
}
}
if (!flag)
{
throw new FormatException(string.Format(CultureInfo.CurrentCulture, Environment.GetResourceString("Format_BadQuote"), new object[] { ch }));
}
return (pos - num2);
}
评论(0)
暂无评论。