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

推荐订阅源

B
Blog RSS Feed
V2EX - 技术
V2EX - 技术
P
Privacy & Cybersecurity Law Blog
T
The Exploit Database - CXSecurity.com
美团技术团队
WordPress大学
WordPress大学
博客园 - 司徒正美
S
Securelist
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
博客园 - Franky
Attack and Defense Labs
Attack and Defense Labs
Security Latest
Security Latest
L
LINUX DO - 最新话题
NISL@THU
NISL@THU
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
腾讯CDC
Y
Y Combinator Blog
The Hacker News
The Hacker News
Security Archives - TechRepublic
Security Archives - TechRepublic
IT之家
IT之家
T
Threatpost
Hugging Face - Blog
Hugging Face - Blog
Scott Helme
Scott Helme
S
SegmentFault 最新的问题
Cyberwarzone
Cyberwarzone
C
Cisco Blogs
阮一峰的网络日志
阮一峰的网络日志
U
Unit 42
B
Blog
Microsoft Azure Blog
Microsoft Azure Blog
P
Proofpoint News Feed
小众软件
小众软件
V
Vulnerabilities – Threatpost
J
Java Code Geeks
V
Visual Studio Blog
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
A
Arctic Wolf
博客园 - 【当耐特】
Microsoft Security Blog
Microsoft Security Blog
S
Security @ Cisco Blogs
雷峰网
雷峰网
Help Net Security
Help Net Security
The Last Watchdog
The Last Watchdog
Recent Announcements
Recent Announcements
G
Google Developers Blog
C
CERT Recently Published Vulnerability Notes
T
Troy Hunt's Blog
MyScale Blog
MyScale Blog

博客园 - 张远强

原版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 }