惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

人人都是产品经理
人人都是产品经理
Blog — PlanetScale
Blog — PlanetScale
MyScale Blog
MyScale Blog
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
WordPress大学
WordPress大学
Vercel News
Vercel News
D
Docker
博客园 - 聂微东
T
Tailwind CSS Blog
aimingoo的专栏
aimingoo的专栏
云风的 BLOG
云风的 BLOG
D
DataBreaches.Net
B
Blog RSS Feed
酷 壳 – CoolShell
酷 壳 – CoolShell
博客园 - Franky
Microsoft Security Blog
Microsoft Security Blog
美团技术团队
F
Fortinet All Blogs
MongoDB | Blog
MongoDB | Blog
T
The Blog of Author Tim Ferriss
GbyAI
GbyAI
N
Netflix TechBlog - Medium
G
Google Developers Blog
腾讯CDC

博客园 - 张远强

原版SQLHelper.cs下载 Chrome浏览器Proxy Switchy、Tampermonkey等扩展程序下载 GreaseMonkey脚本:阻止Google转换搜索链接地址 站在31岁,理解程序员年过三十这道坎 GreaseMonkey让网站登录验证码形同虚设 借Windows说明Linux分区和挂载点 JSON解析类(C#) 彻底解决ASP.NET MD5加密中文结果和ASP不一致的问题 SharpZipLib使用示例 DotNetZip使用示例 Dvbbs 8.2.0 RC1多功能编辑器,提供下载 B/S系统版本管理V1.0正式发布 ASP.NET 2.0缓存 个人网站与动网整合步骤(支持PDO1.0) - 张远强 - 博客园 C#中显/隐式实现接口及其访问方法 C#接口范例 巧用escape解决ASP.NET中URL传参乱码问题 使用Filter实现信息的二次检索 使用overflow代替left截取指定长度字符串
DateTime.ToString格式限定符转义
张远强 · 2011-08-03 · via 博客园 - 张远强

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 }