C#字符串未被识别为有效日期时间

时间:2018-02-02 15:48:58

标签: c# csv datetime

我正在尝试解析CSV文件,并传递所需的字段。

然而,不管我似乎尝试什么,我都被告知'字符串未被识别为有效的DateTime'对于注册日期'字段。

我知道这是这个领域,因为当我把这个作为字符串设置时,并保持' DateOfBirth'作为DateTime,它运行得很好。

以下是字段类型和相关代码。

public string CustomerId { get; set; } 
public string Forename { get; set; }
public string Surname { get; set; }
public DateTime? DateOfBirth { get; set; }
public string VehicleId { get; set; }
public string RegistrationNumber { get; set; }
public string Manufacturer { get; set; }
public string Model { get; set; }
public string EngineSize { get; set; }
public DateTime? RegistrationDate { get; set; }
public string InteriorColour { get; set; }
public string HasHelmet { get; set; }
public string VehicleType { get; set; }

public static IEnumerable<CarData> CsvParser()
    {
        using (TextFieldParser parser = new TextFieldParser(csv_file_path))
        {
            parser.SetDelimiters(new string[] { "," });
            parser.HasFieldsEnclosedInQuotes = false;

            parser.ReadLine();

            while (!parser.EndOfData)
            {
                string[] fields = parser.ReadFields();

                yield return new CarData()
                {
                    CustomerId = fields[0],
                    Forename = fields[1],
                    Surname = fields[2],
                    DateOfBirth = DateTime.Parse(fields[3]),
                    VehicleId = fields[4],
                    RegistrationNumber = fields[5],
                    Manufacturer = fields[6],
                    Model = fields[7],
                    EngineSize = fields[8],
                    RegistrationDate = DateTime.ParseExact(fields[9], "yyyy-MM-dd", CultureInfo.InvariantCulture),
                    InteriorColour = fields[10],
                    HasHelmet = fields[11],
                    VehicleType = fields[12]
                };
            }
        }
    }

现在我一直在尝试.ParseExact但它仍然抛出错误..任何想法?

编辑:我要解析的字符串示例是&#39; 2007-02-28&#39;

关于潜在的重复问题,我相信我已经在上面的代码中尝试过该解决方案。

3 个答案:

答案 0 :(得分:0)

在尝试解析之前,检查字段是否为空值或空值。

更改构造函数的这一行:

RegistrationDate = DateTime.ParseExact(fields[9], "yyyy-MM-dd", CultureInfo.InvariantCulture),

对此:

RegistrationDate = string.IsNullOrWhiteSpace(fields[9]) ? null : DateTime.ParseExact(fields[9].Trim(), "yyyy-MM-dd", CultureInfo.InvariantCulture),

确保RegistrationDate字段的后续逻辑帐户可能为null

答案 1 :(得分:0)

您正在解析CSV中的空值。

有时处理CSV文件时,您可能不会期望该值存在。

private DateTime ParseDateTimeField(string date)
{
    //If our string is not null
    if (!string.IsNullOrWhiteSpace(date))
        return DateTime.ParseExact(date, "yyyy-MM-dd", CultureInfo.InvariantCulture);
    else
        //Do something like return a specific date or maybe today.
        //return DateTime.Today;
}

在您的代码中:

 RegistrationDate = ParseDateTimeField(fields[9]);

答案 2 :(得分:0)

可以编写

Sven的函数来处理应该保存有效日期/时间值的单元格中的任何可能的错误信息:

private DateTime? ParseDateTimeField(string date)
{
    DateTime value;
    if (!DateTime.TryParseExact(dateString, "yyyy-MM-dd", CultureInfo.InvariantCulture, DateTimeStyles.None, out value))
        return null; 
    return value;
}

这应该使您的代码更加健壮,因为它不会因为不仅仅是空单元格的无效值而崩溃。