检查日期字符串的文化,然后将其转换为DateTime

时间:2018-01-29 08:54:56

标签: c# string date datetime

对于我的应用程序,第三方应用程序(在Java上运行)提供日期字符串。现在这个应用程序以某种方式使用系统语言来给出日期字符串。

所以2009年4月6日可能会是这样的:

  • 2009年4月6日(en-US)
  • 2009年4月6日(en-GB)
  • 6 avr。 2009(fr-FR)
  • 06.04.2009(de-DE)

依旧......

对于我的应用程序,我需要将这些字符串转换为DateTime。我知道方法Convert.ToDateTime()DateTime.Parse()DateTime.ParseExact()

这段代码是我如何区分en-US和de-DE:

private static DateTime ConvertToDateTime(string source)
{
        CultureInfo cuDe = new CultureInfo("de-DE");
        CultureInfo cuEn = new CultureInfo("en-US");

        var result = new DateTime();

        if (source.Contains("."))
        {
            result = Convert.ToDateTime(source, cuDe);
        }
        else
        {
            result = Convert.ToDateTime(source, cuEn);
        }

        return result;
}

这对fr-FR中的字符串当然不起作用。我的问题是我不知道第三方应用程序运行的系统上将设置哪种语言。

所以我的问题是:有没有办法检查字符串代表哪种文化日期格式?所以我会输入“6 avr.2009”并返回fr-FR?或者我是否真的必须检查可能出现的每种可能的语言日期格式并自行检查,例如通过以特定语言运行string.Contains()几个月?

注意:

  • 我无法更改第三方应用程序或其输出
  • 我无法获得有关应用程序运行的系统的其他信息

2 个答案:

答案 0 :(得分:1)

一般情况下,仅通过查看就无法找出用于创建字符串的原始文化。

考虑以下示例:

var date = new DateTime(1900, 12, 11);

var enUs = new CultureInfo("en-US");
var enGb = new CultureInfo("en-GB");

var strUs = date.ToString(enUs);
var strGb = date.ToString(enGb);

strUs的输出为12/11/1900

strGb的输出为11/12/1900。请注意,月份和日期以美国格式反转。

通过查看字符串,我们无法分辨哪个是月份,哪个是哪一天。这就是为什么API应该使用明确的格式,如ISO 8601

话虽如此,如果我们知道外部服务使用的确切格式并且这些格式是可区分的,您可以尝试使用已知的格式字符串进行解析。

private static DateTime ParseMultiCulture(string dateString) {
    DateTime output;

    string[] formatsEnUs = {"MMM d, yyyy"};
    string[] formatsEnGB = {"dd-MMM-yyyy"};
    string[] formatsFrFr = {"d MMM yyyy"};
    string[] formatsDeDe = {"dd.MM.yyyy"};


    if (DateTime.TryParseExact(dateString, formatsEnUs, new CultureInfo("en-US"), 
            DateTimeStyles.None, out output)) {
        return output;
    }

    if (DateTime.TryParseExact(dateString, formatsEnGB, new CultureInfo("en-GB"), 
            DateTimeStyles.None, out output)) {
        return output;
    }

    if (DateTime.TryParseExact(dateString, formatsFrFr, new CultureInfo("fr-FR"), 
            DateTimeStyles.None, out output)) {
        return output;
    }

    if (DateTime.TryParseExact(dateString, formatsDeDe, new CultureInfo("de-De"), 
            DateTimeStyles.None, out output)) {
        return output;
    }

    throw new NotSupportedException("Given datestring is in a format that is not supported.");
}

C# Fiddle

答案 1 :(得分:0)

如果您只需要支持日期的特定文化集,则可以使用以下代码。

private static DateTime GetDateTime(string dateString){
        DateTime res = new DateTime();
        if(DateTime.TryParse(dateString, System.Globalization.CultureInfo.GetCultureInfo("en-GB"),
System.Globalization.DateTimeStyles.None, out res))
            return res;
        else if(DateTime.TryParse(dateString, System.Globalization.CultureInfo.GetCultureInfo("en-US"),
System.Globalization.DateTimeStyles.None, out res))
            return res;
        else if(DateTime.TryParse(dateString, System.Globalization.CultureInfo.GetCultureInfo("fr-FR"),
System.Globalization.DateTimeStyles.None, out res))
            return res;
        else if(DateTime.TryParse(dateString, System.Globalization.CultureInfo.GetCultureInfo("de-DE"),
System.Globalization.DateTimeStyles.None, out res))
            return res;
        //throw error or handle the not matcing case here
         Console.WriteLine("Not Matching "+dateString);           
        return res;
    }

Ideone:https://ideone.com/vTx614