我正在尝试将以下字符串(法语日期格式和英语日期格式的混合物)值转换为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”格式。
答案 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 2014
和Le 26 Janvier 2016
除外,它们将引发异常。 TryParse可以执行这些操作,但是会导致错误的值。 TryParseExact要求您提前知道格式。但是,您不必自己进行月份转换。 DateTime可以解决这个问题。
最好的解决方案是验证您的输入。如果工作太多,我将构建您可能收到的所有可能格式的列表,并使用TryParseExact逐一循环。如果您不知道所有可能的格式(例如1er décembre 2014
这样的例子),那么您的位置并不是很好。肮脏但快速的解决方案是将我上面发布的代码包装在try / catch中,然后在Exception上尝试其他解析方法。