将不一致的数据转换为DateTime

时间:2014-09-05 05:20:31

标签: c# .net datetime visual-studio-2012

我必须读取一个文件,并遍历每一行并将其注入数据库,但问题是当我用,分割每一行时,其中一个索引包含格式不一致的日期字符串。

有时它从年2014-01-01开始,有时从第01-01-2014天开始。 问题是我的数据库字段类型是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);
    }            
}

4 个答案:

答案 0 :(得分:3)

这有效......

        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);
        }

答案 1 :(得分:1)

如果您了解文化,可以尝试使用DateTime.Parse方法。

因此,在该文化中,只要01-01-2014始终表示dd-mm-yyyymm-dd-yyyy,您就可以了。

既然你提到处理一个多行数据文件,你可能应该DateTime.TryParseTryParse如果无法解析日期,则不会抛出异常,而日期又不会终止批处理。这允许您记录失败并在之后处理它们。

答案 2 :(得分:1)

不一致的日期格式在所有情况下都会很痛苦。如果您知道有一组特定的文化应该尝试用于转换(或者如果有办法从另一个领域确定文化),那么我建议您尝试执行类似以下的操作:

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被抛出,则使用。

答案 3 :(得分:0)

确保月份和日期字段在输入文件中处于一致的位置。然后使用DateTime.Parse方法。