将法语日期(格式不一致)转换为yyyy-MM-dd格式

时间:2019-04-24 17:39:57

标签: c#

我正在尝试将以下字符串(法语日期格式和英语日期格式的混合物)值转换为yyyy-MM-dd格式。

20 Avril 2001
20-Apr-01
22 Mai 2001
22-May-01
29 Mai 2001
8 Juin 2001
15 Juin 2001
18-Jun-01
21 Juin 2001
06-Nov-01
1er décembre 2014
3 Décembre 2014
Le 26 Janvier 2016
8 Février 2016

问题在于格式不一致。我正计划替换下面的法国月份,以便所有月份的值都使用英语:

Janvier     =   January
Février     =   February
Mars        =   March
Avril       =   April
Mai         =   May
Juin        =   June
Juillet     =   July
Aout        =   August
Septembre   =   September
Octobre     =   October
Novembre    =   November
Décembre    =   December   

然后,检查格式(是DD-MM-YY还是DD MMM YYYY等),然后将其转换为DateTime,如下所示:

string iString = "15 June 2001"; //one of the value from the above list.
string format = "yyyy-MM-dd";
DateTime oDate = DateTime.ParseExact(iString, format, System.Globalization.CultureInfo.InvariantCulture);

有更好的方法吗?

编辑:我需要将这些日期值导入SQL Server,因此我试图将字符串值转换为“ yyyy-MM-dd”格式。

2 个答案:

答案 0 :(得分:3)

我将有2个循环:枚举所有值和所有格式,将成功解析的内容添加到List<DateTime>,将失败的内容添加到List<string>中以进行进一步分析:

var results = new List<DateTime>();
var errors = new List<string>();

foreach (string value in values)
{
    bool success = false;

    foreach (string format in formats)
    {
        if (DateTime.TryParseExact(value, format, culture, out var result))
        {
            results.Add(result);
            success = true;
            break;
        }
    }

    if (!success)
    {
        errors.Add(value);
    }
}

return (results, errors);

an overload接受string[] formats进一步简化了实现:

public static bool TryParseExact (string s, string[] formats, IFormatProvider provider, System.Globalization.DateTimeStyles style, out DateTime result);

赞:

var results = new List<DateTime>();
var errors = new List<string>();

foreach (string value in values)
{
    if (DateTime.TryParseExact(value, formats, culture, out var result))
    {
        results.Add(result);
    }
    else
    {
        errors.Add(value);
    }
}

return (results, errors);

答案 1 :(得分:2)

C#实际上非常擅长解析各种格式的DateTime。

DateTime oDate = DateTime.Parse(oTime, CultureInfo.GetCultureInfo("fr-FR"));

将为您的每个示例提供正确的DateTime,但1er décembre 2014Le 26 Janvier 2016除外,它们将引发异常。 TryParse可以执行这些操作,但是会导致错误的值。 TryParseExact要求您提前知道格式。但是,您不必自己进行月份转换。 DateTime可以解决这个问题。

最好的解决方案是验证您的输入。如果工作太多,我将构建您可能收到的所有可能格式的列表,并使用TryParseExact逐一循环。如果您不知道所有可能的格式(例如1er décembre 2014这样的例子),那么您的位置并不是很好。肮脏但快速的解决方案是将我上面发布的代码包装在try / catch中,然后在Exception上尝试其他解析方法。