Разбор C# до даты и времени независимо от информации о культуре

У меня проблема с синтаксическим анализом строки даты, где язык не английский. Пример строки даты: "8 августа 2016 г., век", что на английском языке означает "8 апреля 2016 г., пятница".

Я попробовал это, но не повезло.

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

В моем случае строка даты может быть на любом языке, поэтому я не могу указать культуру при разборе.
Я ценю вашу помощь. Благодарю.

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" четвертого мая или пятого апреля? Любой синтаксический анализатор думает, что четвертое мая более вероятно просто потому, что больше культур разбирают его таким образом. На моей машине, по крайней мере. Но это не понравится американским авторам (которые чрезмерно представлены в Интернете), поэтому, возможно, следует учитывать вероятность появления культур.

Этот код не должен использоваться для анализа произвольного пользовательского ввода, не говоря уже о всем вводе, и даже в контексте скребка, в котором действительно отсутствуют все другие подсказки о языке, это, вероятно, не лучший подход. Также помните, что это медленно; на средней машине сотни культур. Угадайте всю культуру для страницы сначала, а затем последовательно анализируйте на основе этого, это абсолютно лучшая идея.

Другие вопросы по тегам