DateTime.Parse()如何在C#中工作?

时间:2016-05-19 17:12:08

标签: c# .net parsing datetime cultureinfo

我知道DateTime解析可能很棘手,但由于有很多机制依赖于DateTime.Parse()特别是它的DateTime.Parse(string)重载,我认为理解它是如何工作的有意义的引擎盖以及它在不同输入上的表现。

我们所知道的:

MSDN states当您使用DateTime.Parse(String)重载时,格式化是从CurrentThread.Culture派生的,但它引起了注意:

  • 文化特定数据可以在框架的不同版本之间发生变化(并且确实如此)
  • 可以通过操作系统设置覆盖特定于文化的数据
  • DateTime.Parse()试图变得聪明

由于这些原因,当有人在不同的用户输入上调用此函数时,我很难预测结果会是什么。

即使我指定了一种文化,DateTime.Parse也可以将字符串识别为您可能认为无法识别的有效日期时间。例如,以下所有日期都有效 - 以下是我的一些发现:

var at = new System.Globalization.CultureInfo("de-AT", false);
System.Threading.Thread.CurrentThread.CurrentCulture = at;

// it doesn't care about the order:
DateTime.Parse("21.12.2020", at).Dump();
DateTime.Parse("2020.12.31", at).Dump();

// it accepts multiple separators:
DateTime.Parse("2020,12,31", at).Dump();
DateTime.Parse("2020/12/31", at).Dump();
DateTime.Parse("2020 12 31", at).Dump();

// it accepts multiple separators even in a single string:
DateTime.Parse("1999/12-31", at).Dump();

// year must consist at least 3 digits:
DateTime.Parse("100/12-31", at).Dump();  // this works
//DateTime.Parse("99/12-31", at).Dump(); -> this doesn't
DateTime.Parse("001/12-31", at).Dump(); // but this works again (3 digits)

// trimming (well, MSDN mentions this)
DateTime.Parse("  100/12,31   ", at).Dump();

对我而言,这里发生的事情并不那么清楚。 /中甚至没有提到分隔符,DateTimeFormatInfo.CurrentInfo,因此我不知道它来自何处。这些分隔符是否在DateTime.Parse中进行了硬编码?我试着阅读反汇编的代码,但对我来说有点复杂。

有没有简单的方法来总结会发生什么以及支持哪种格式?

我知道在现实生活中的例子"如果我必须使用给定格式解析DateTime,我应该使用ParseExact,但由于有很多东西依赖于此(例如ASP.NET MVC模型绑定),我认为值得一个问题它究竟做了什么 - 为什么它将"100/3.14"识别为有效的DateTime而不是分裂:)

0 个答案:

没有答案