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

Posted

技术标签:

【中文标题】无论文化信息如何,C# 解析为日期时间【英文标题】:C# parsing to datetime regardless of culture info 【发布时间】:2017-04-15 00:26:40 【问题描述】:

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

我试过了,但没有运气。

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

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

【问题讨论】:

你试过CultureInfo.CurrentCulture吗? 很遗憾,CurrentCulture 不起作用。 有没有办法根据与日期相关的其他信息来获取文化?如果没有,我想知道是否有可能这样做,除了迭代每一个已知的文化并尝试解析它。 您的日期字符串来自哪里?我真的很难理解一种与文化无关的解决方案来解析特定文化的日期。您要么需要事先了解特定的文化,要么在解析之前以文化中性格式获取日期字符串。 在这种情况下,您应该能够使用 html <meta> 标签和/或 HTTP 标头(如 Accept-Language),或者甚至可以创建查找表 website => locale 来确定日期字符串的文化。否则,请尝试使用一组预定义(最好是小的)众所周知的文化来解析每个日期,直到您找到至少一个能够成功解析日期的文化。无论如何,我不认为任何方法都是 100% 可靠的。 【参考方案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”是 5 月 4 日还是 4 月 5 日?任何解析器都认为 5 月 4 日更有可能仅仅是因为更多的文化以这种方式解析它。至少在我的机器上。但这不会取悦美国作者(他们在互联网上的比例过高),因此可能需要考虑文化的可能性。

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

【讨论】:

以上是关于无论文化信息如何,C# 解析为日期时间的主要内容,如果未能解决你的问题,请参考以下文章

c#日期时间格式

为啥不管文化如何,C# DateTime 解析“01/05/2020”都是一样的?

根据c#中的文化转换(更改)当前日期时间

解析法语日期

返回一个文化格式化日期的数组 C# MVC3

Globalize.js - 如何解析日期和时间而不仅仅是日期