无论文化信息如何,C#解析为datetime

时间:2016-11-30 15:45:07

标签: c# datetime cultureinfo invariantculture

我在解析一些语言不是英语的日期字符串时遇到问题。 样本日期字符串为“8 avril 2016 vendredi”,即“2016年4月8日星期五”。

我试过这个但没有运气。

DateTime dateTime;
DateTime.TryParse("8 avril 2016 vendredi", CultureInfo.InvariantCulture, DateTimeStyles.None, out dateTime);

在我的例子中,日期字符串可以是任何语言,因此我无法在解析时指定文化 我感谢您的帮助。感谢。

1 个答案:

答案 0 :(得分:1)

看哪,任何解析器都很糟糕!

CultureInfo.GetCultures(CultureTypes.AllCultures).Select(culture => {
    DateTime result;
    return DateTime.TryParse(
        "8 avril 2016 vendredi", 
        culture, 
        DateTimeStyles.None, 
        out result
    ) ? result : default(DateTime?);
})
.Where(d => d != null)
.GroupBy(d => d)
.OrderByDescending(g => g.Count())
.FirstOrDefault()
.Key

这要求系统上的每个文化都解析日期,并选择最常出现的日期作为"赢家"。如果没有文化可以解析日期,则返回null

不难想出这种方法无法提供正确的结果,因为最常见的结果不一定是正确的结果,而某些日期确实是模棱两可的。是" 04-05-2016"五月四日或四月五日?任何解析器认为五月四日更有可能仅仅因为更多的文化以这种方式解析它。在我的机器上,至少。但这并不能取悦美国作者(他们在互联网上的人数过多),因此可能需要考虑文化的可能性。

此代码不应该用于解析任意用户输入,更不用说所有输入,甚至在刮刀的上下文中真正缺乏关于该语言的所有其他线索,这可能不是最好的方法。还要注意这很慢;平均机器上有数百种文化。首先猜测整个页面的文化然后根据它进行一致的解析绝对是一个更好的主意。