Datetime.Parse()可切换的格式


查看格式:"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

相关内容

  • 没有找到相关文章

最新更新