[英]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 2014
和Le 26 Janvier 2016
除外,這將引發異常。 TryParse可以執行這些操作,但是會導致錯誤的值。 TryParseExact要求您提前知道格式。 但是,您不必自己進行月份轉換。 DateTime可以處理。
最好的解決方案是驗證您的輸入。 如果工作太多,我將構建您可能收到的所有可能格式的列表,並使用TryParseExact逐一循環。 如果您不知道所有可能的格式(我假設1er décembre 2014
這樣的例子就是這種情況),那么您確實不是一個好地方。 骯臟但快速的解決方案是將我上面發布的代碼包裝在try / catch中,然后在Exception上嘗試其他解析方法。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.