Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2008/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将不一致数据转换为日期时间_C#_.net_Datetime_Visual Studio 2012 - Fatal编程技术网

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()
将是更好的选择,如果这些是您正在使用的唯一格式。