正在将不一致的数据转换为DateTime

本文关键字:转换 DateTime 数据 不一致 | 更新日期: 2023-09-27 18:20:54

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

有时它从年份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);
    }            
}

正在将不一致的数据转换为DateTime

这很有效。。。

        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的意思始终是dd-mm-yyyymm-dd-yyyy,你就没事了。

既然您提到了处理多行数据文件,那么您可能应该DateTime.TryParse.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.Passe方法。