DateTime.ToString格式限定符转义

 

1 DateTime.Now.ToString("yyyy-MM-dd")


上边代码结果为:2011-08-03,其中y、M、d即为格式限定符,他们在DateTime.ToString具有限定格式意义,但在一些场合中我们希望这些字符能直接输出,即暂时取消格式限定符的作用,这就需要转义。

 

一、DateTime.ToString格式限定符转义

 

1.单个格式限定符转义

 

1 DateTime.Now.ToString("year:yyyy")  //11ear:2011
2 DateTime.Now.ToString(@"\year:yyyy")  //year:2011

 

可见,单个格式限定符转义只需在格式限定符前加"\"即可。

 

2.多个格式限定符转义

 

1 DateTime.Now.ToString("date:yyyy")    //3a下e:2011
2 DateTime.Now.ToString("'date':yyyy")    //year:2011
3 DateTime.Now.ToString("\"date\":yyyy")    //year:2011

 

可见,将多个连续的字符放在单/双引号中可实现批量转义。

 

二、转义实现解析

 

使用Reflector查看DateTime.ToString方法,最终转到DateTimeFormat.FormatCustomized方法上,该方法相关代码片断如下:

复制代码
 1 case '\\':
 2     {
 3         num4 = ParseNextChar(format, i);
 4         if (num4 < 0)
 5         {
 6             throw new FormatException(Environment.GetResourceString("Format_InvalidString"));
 7         }
 8         outputBuffer.Append((char)num4);
 9         num2 = 2;
10         continue;
11     }
12 case '\'':
13 case '"':
14     {
15         StringBuilder result = new StringBuilder();
16         num2 = ParseQuoteString(format, i, result);
17         outputBuffer.Append(result);
18         continue;
19     }
复制代码

 

DateTimeFormat类中与上述代码相关的两个方法:

复制代码
 1 private static int ParseNextChar(string format, int pos)
 2 {
 3     if (pos >= (format.Length - 1))
 4     {
 5         return -1;
 6     }
 7     return format[pos + 1];
 8 }
 9 
10 internal static int ParseQuoteString(string format, int pos, StringBuilder result)
11 {
12     int length = format.Length;
13     int num2 = pos;
14     char ch = format[pos++];
15     bool flag = false;
16     while (pos < length)
17     {
18         char ch2 = format[pos++];
19         if (ch2 == ch)
20         {
21             flag = true;
22             break;
23         }
24         if (ch2 == '\\')
25         {
26             if (pos >= length)
27             {
28                 throw new FormatException(Environment.GetResourceString("Format_InvalidString"));
29             }
30             result.Append(format[pos++]);
31         }
32         else
33         {
34             result.Append(ch2);
35         }
36     }
37     if (!flag)
38     {
39         throw new FormatException(string.Format(CultureInfo.CurrentCulture, Environment.GetResourceString("Format_BadQuote"), new object[] { ch }));
40     }
41     return (pos - num2);
42 }
复制代码


 

posted @   张远强  阅读(518)  评论(0编辑  收藏  举报
编辑推荐:
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
点击右上角即可分享
微信分享提示