"MMM d yyyy"
这是工作
var t="Mar 2013 7";
DateTime dt=DateTime.Parse(t);
,
also this :"Mar 7 2013"
and this :"7 Mar 2013"
正在工作
看着:
new DateTimeFormatInfo()
.GetAllDateTimePatterns()
.Select((i,n)=>n+" "+i)
.ToList()
.ForEach(f=>Console.WriteLine(f));
这是日期和时间值可以使用的所有标准模式格式化。
结果是:
0 MM/dd/yyyy
1 yyyy-MM-dd
2 dddd, dd MMMM yyyy
3 dddd, dd MMMM yyyy HH:mm
4 dddd, dd MMMM yyyy hh:mm tt
5 dddd, dd MMMM yyyy H:mm
6 dddd, dd MMMM yyyy h:mm tt
7 dddd, dd MMMM yyyy HH:mm:ss
8 MM/dd/yyyy HH:mm
9 MM/dd/yyyy hh:mm tt
10 MM/dd/yyyy H:mm
11 MM/dd/yyyy h:mm tt
12 yyyy-MM-dd HH:mm
13 yyyy-MM-dd hh:mm tt
14 yyyy-MM-dd H:mm
15 yyyy-MM-dd h:mm tt
16 MM/dd/yyyy HH:mm:ss
17 yyyy-MM-dd HH:mm:ss
18 MMMM dd
19 MMMM dd
20 yyyy'-'MM'-'dd'T'HH':'mm':'ss.fffffffK
21 yyyy'-'MM'-'dd'T'HH':'mm':'ss.fffffffK
22 ddd, dd MMM yyyy HH':'mm':'ss 'GMT'
23 ddd, dd MMM yyyy HH':'mm':'ss 'GMT'
24 yyyy'-'MM'-'dd'T'HH':'mm':'ss
25 HH:mm
26 hh:mm tt
27 H:mm
28 h:mm tt
29 HH:mm:ss
30 yyyy'-'MM'-'dd HH':'mm':'ss'Z'
31 dddd, dd MMMM yyyy HH:mm:ss
32 yyyy MMMM
33 yyyy MMMM
问题:
我在列表中没有看到
MMM d yyyy
格式。那么它是如何做到的呢?它会尝试所有的组合吗?在
MMM d yyyy
格式中添加时间如何?[Mar 3 2007 13:13:13]
也可以,但是没有特定的格式。那么它是如何做到的呢?
我使用了Reflector来查看这个。它真的很复杂,有数百行解析代码!
然而,最终它会对输入字符串进行标记,并尝试将这些标记分类为日名、月名、年、日数等。
特别是一个叫做internal TokenHashValue[] CreateTokenHashTable()
的函数有这样的东西:
for (int i = 1; i <= 12; i++)
{
this.InsertHash(dtfiTokenHash, this.GetAbbreviatedMonthName(i), TokenType.MonthToken, i);
}
它使用这个(您可以看到它包含所有缩写的月份名称)来确定一个令牌是否是一个月份名称。对于日名也有类似的代码。
解析代码还检查其中一个数字是否大于2位长。如果是,它假设是一年。这意味着(你可以验证它)你可以有一个3位数的年份,它仍然可以解析它。但事情变得更加复杂!它还检查数字是否大于12,如果大于,则假定是一年。
如果你输入两个小于或等于12的数字,它仍然工作,但它假设第一个数字是一天,第二个数字是一个月(对于英国文化-我敢打赌这与其他文化不同)。
这当然允许它在没有警告的情况下解析模棱两可的日期。
结果是:永远不要这样解析日期
总是ParseExact()
.
我猜它使用的是格式说明符,而不是它们的排列。
从字面"Mar 2013 7"的书写方式来看,我怀疑它们在解析中可能有任何歧义。
- Mar与MMM完全匹配
- 2003完全匹配yyyy
- 7完全匹配
我找到了一个到DateTime的链接。解析源代码:http://typedescriptor.net/name/members/5B57671F27DBC0AEA0EB9825243834CF-System.DateTime.Parse(字符串、IFormatProvider DateTimeStyles)
您可以单击链接以深入了解私有方法,但这会变得复杂。但它看起来像编译器一样进行词法分析和解析。字符串被分成几个部分(标记),它试图识别每个部分是一年,一个月,等等。
当然可能会有一些歧义,例如,也许你的意思是dd-MM-yyyy,但它被解析为MM-dd-yyyy。但这就是为什么你可以指定一个特定于文化的IFormatProvider