C# 将不一致数据转换为日期时间
我必须读取一个文件,循环遍历每一行并将其注入数据库,但问题是当我使用C# 将不一致数据转换为日期时间,c#,.net,datetime,visual-studio-2012,C#,.net,Datetime,Visual Studio 2012,我必须读取一个文件,循环遍历每一行并将其注入数据库,但问题是当我使用拆分每一行时,其中一个索引包含格式不一致的日期字符串 有时从2014年1月1日开始,有时从2014年1月1日开始。 问题是我的数据库字段类型是datetime,我无法修复数据,因为它是4000行数据,是否有方法转换它 foreach (string line in lines) { var txt = line.Split(new char[] { ',' }, StringSplitOptions.RemoveEmpt
拆分每一行时,
其中一个索引包含格式不一致的日期字符串
有时从2014年1月1日开始,有时从2014年1月1日开始。
问题是我的数据库字段类型是datetime,我无法修复数据,因为它是4000行数据,是否有方法转换它
foreach (string line in lines)
{
var txt = line.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries);
idx += 1;
if (txt.Length == 49)
{
if (txt[24] != "")
{
user_list usr = new user_list
{
email = (txt[24].Replace("'","")).Replace(" ",""),
birthday = Convert.ToDateTime(txt[10].Replace("'","")), //THIS PART HAVE INCONSISTENT DATE FORMAT
birthplace = (txt[9].Replace("'","")).Replace(" ",""),
id_no = (txt[29].Replace("'", "")).Replace(" ", ""),
id_valid_to = valid_to,
modified_date = DateTime.Now,
created_date = Convert.ToDateTime(txt[46].Replace("'", "")),
language_pref = "ind",
status_user = 1,
user_type = "user",
managed_by = "self",
expected_salary = salary
};
imp.user_lists.InsertOnSubmit(usr);
}
}
else
{
throw new Exception ("index : " + idx + " , total length : " + txt.Length);
}
}
确保月和日字段在输入文件中的位置一致。然后使用DateTime.Parse方法。确保月和日字段在输入文件中的位置一致。然后使用DateTime.Parse方法。如果您了解区域性,可以尝试使用该方法 因此,在这种文化中,只要
01-01-2014
始终意味着dd-mm-yyyy
或mm-dd-yyyy
,你就没事了
既然您提到了处理多行数据文件,那么您可能应该这样做
TryParse
如果无法解析日期,则不会引发异常,这反过来也不会终止批处理过程。这允许您记录故障并在事后处理。如果您了解区域性,可以尝试使用方法
因此,在这种文化中,只要01-01-2014
始终意味着dd-mm-yyyy
或mm-dd-yyyy
,你就没事了
既然您提到了处理多行数据文件,那么您可能应该这样做
TryParse
如果无法解析日期,则不会引发异常,这反过来也不会终止批处理过程。这允许您记录故障并在事后处理。不一致的日期格式在所有情况下都可能是一个难题。如果您知道应该尝试使用一组特定的区域性来转换(或者如果有一种方法可以从另一个字段确定区域性),那么我建议您尝试执行以下类似操作:
DateTime convertedDate;
var convertSuccessful = DateTime.TryParse(date, new CultureInfo("en-US"), DateTimeStyles.None, out convertedDate);//YYYY-MM-DD
if (!convertSuccessful)
{
DateTime.TryParse(date, new CultureInfo("en-GB"), DateTimeStyles.None, out convertedDate); // DD-MM-YYYY
}
注意:我认为“en-US”文化实际上是“mm-dd-yyyy”因此,根据需要替换另一个区域性或构建自己的区域性-这个答案更多地是关于在一个区域性转换失败时可以使用的技术,而不会导致引发
FormatException
。在所有情况下,不一致的日期格式都可能是一个难题。如果您知道应该尝试使用一组特定的区域性来转换(或者如果有一种方法可以从另一个字段确定区域性),那么我建议您尝试执行以下类似操作:
DateTime convertedDate;
var convertSuccessful = DateTime.TryParse(date, new CultureInfo("en-US"), DateTimeStyles.None, out convertedDate);//YYYY-MM-DD
if (!convertSuccessful)
{
DateTime.TryParse(date, new CultureInfo("en-GB"), DateTimeStyles.None, out convertedDate); // DD-MM-YYYY
}
注意:我认为“en-US”文化实际上是“mm-dd-yyyy”,因此,根据需要替换另一种文化或构建自己的文化-这个答案更多地是关于在一种文化转换失败时可以使用的技术,而不会导致抛出格式异常。这很有效
string[] dates = new [] { "2014-01-01", "01-01-2014"};
foreach (string d in dates)
{
DateTime parsed;
if (DateTime.TryParseExact(d, "yyyy-MM-dd", CultureInfo.InvariantCulture, DateTimeStyles.None, out parsed))
Console.WriteLine("yyyy-MM-dd: {0}", parsed);
else if (DateTime.TryParseExact(d, "dd-MM-yyyy", CultureInfo.InvariantCulture, DateTimeStyles.None, out parsed))
Console.WriteLine("dd-MM-yyyy: {0}", parsed);
}
这很有效
string[] dates = new [] { "2014-01-01", "01-01-2014"};
foreach (string d in dates)
{
DateTime parsed;
if (DateTime.TryParseExact(d, "yyyy-MM-dd", CultureInfo.InvariantCulture, DateTimeStyles.None, out parsed))
Console.WriteLine("yyyy-MM-dd: {0}", parsed);
else if (DateTime.TryParseExact(d, "dd-MM-yyyy", CultureInfo.InvariantCulture, DateTimeStyles.None, out parsed))
Console.WriteLine("dd-MM-yyyy: {0}", parsed);
}
尝试使用DateTime.Parse方法。它将“01-01-2014”和“2014-01-01”解析为相等的日期时间。在某种程度上,格式类型如何可用?数据是否仅在您提到的两种格式(yyyy-mm dd和dd-mm-yyyy)之间变化?或者它有时也是mm-dd-yyyy格式?在这种情况下,您可以使用DateTime.TryParseExact和不变量文化,正如Mick在回答中所建议的那样。尝试使用DateTime.Parse方法。它将“01-01-2014”和“2014-01-01”解析为相等的日期时间。在某种程度上,格式类型如何可用?数据是否仅在您提到的两种格式(yyyy-mm dd和dd-mm-yyyy)之间变化?或者有时也是mm dd yyyy格式?在这种情况下,您可以使用DateTime.TryParseExact和不变量文化,正如Mick在回答中所建议的那样。thx,我尝试过,但DateTime.tryparse还需要一个参数,投票通过,Mick解决方案有效。修复了方法参数。是的,DateTime.TryParseExact()
将是更好的选择,如果这些是您正在使用的唯一格式。thx,我尝试过,但是DateTime.tryparse需要另外一个参数,投票通过,mick解决方案有效。修复了方法参数。是的,DateTime.TryParseExact()
将是更好的选择,如果这些是您正在使用的唯一格式。