c# - 检查日期字符串是什么区域性,然后将其转换为 DateTime

标签 c# string date datetime

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

所以 2009 年 4 月 6 日可能看起来像这样:

  • 2009 年 4 月 6 日(美国)
  • 2009 年 4 月 6 日(zh-CN)
  • 6 avr。 2009(法国-法国)
  • 2009 年 4 月 6 日(去德国)

等等..

对于我的应用程序,我需要将这些字符串转换为日期时间。我知道 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 中的字符串。我的问题是我不知道将在第 3 方应用程序运行的系统上设置哪种语言。

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

注释:

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

最佳答案

一般来说,仅仅通过查看字符串是不可能找出使用哪种原始文化来创建该字符串的。

考虑以下示例:

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

关于c# - 检查日期字符串是什么区域性,然后将其转换为 DateTime,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48497482/

相关文章:

c# - 在保持多态性的同时更改子类的属性访问器的适当方法是什么?

mysql - Doctrine 2 DQL CONCAT 字段和常量字符串

java - 如何在java中创建包含转义序列的字符串而不使用StringEscapeUtils类?

ruby-on-rails - Ruby on Rails : How to get the current week and loop through it to display its days?

c# - Stream.Read 如何在不传递 ref 关键字的情况下写入/访问缓冲区参数?

C# - 常量属性是否等同于 lambda 表达式?

c# - 图标存在于系统托盘中?

java - 如何处理不可打印值的 "print"字节数组

android - 如何从当前日期找到这个周末和下一个周末?

java - 在 JAVA 中解析 RFC 2822 日期