簡體   English   中英

將法語日期(格式不一致)轉換為yyyy-MM-dd格式

[英]Convert French Dates (inconsistent format) to yyyy-MM-dd format

我正在嘗試將以下字符串(法語日期格式和英語日期格式的混合物)的值轉換為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個循環:枚舉所有值和所有格式,將成功解析的內容添加到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);

一個接受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);

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上嘗試其他解析方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM