无论文化信息如何,C# 都解析为日期时间

Wyl*_*rio 1 c# datetime cultureinfo invariantculture

我在解析某些语言不是英语的日期字符串时遇到问题。示例日期字符串是“8 avril 2016 vendredi”,即英语中的“8 april 2016 friday”。

我试过这个,但没有运气。

DateTime dateTime;
DateTime.TryParse("8 avril 2016 vendredi", CultureInfo.InvariantCulture, DateTimeStyles.None, out dateTime);
Run Code Online (Sandbox Code Playgroud)

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

Jer*_*ert 5

看哪,可怕的任何解析器!

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
Run Code Online (Sandbox Code Playgroud)

这要求系统上的每个文化解析日期,并选择出现频率最高的日期作为“赢家”。null如果没有文化可以解析日期,它会返回。

不难想到这可能无法提供正确的结果,因为最常见的结果不一定是正确的,而且有些日期确实不明确。“04-05-2016”是五月四日还是四月五日?any 解析器认为五月四日更有可能仅仅是因为更多的文化以这种方式解析它。至少在我的机器上。但这不会让美国作者(他们在互联网上的人数过多)满意,所以也许需要考虑文化的可能性。

这段代码不应该用于解析任意用户输入,更不用说所有输入,即使在真正缺乏关于语言的所有其他线索的爬虫的上下文中,这可能不是最好的方法。还要注意这很慢;一台普通机器上有数百种文化。首先猜测页面的整个文化,然后基于此进行持续解析绝对是一个更好的主意。